2017-05-21 3 views
0

J'ai vu quelques questions concernant quelque chose de similaire au mien, mais je pense que les cmdlets de module WebAdministration pourraient avoir un peu plus d'ambiguïté en eux.Comment puis-je invoke-command avec succès sur un serveur distant à Add-WebConfigurationProperty

Ce que je suis en train de faire: Exécutez les opérations suivantes sur un serveur distant:

Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." 
Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." -value @{users="$DomainUser";access='Read,Write,Source';path='*'} 

Ceux-ci fonctionnent parfaitement bien quand je les exécuter sur le serveur lui-même, et fonctionne aussi parfaitement bien quand je Exécutez-les de manière interactive en créant un nouveau-PSSession

Lorsque j'exécute le script suivant de manière non interactive, cependant, l'erreur que je reçois semble indiquer que ces instructions s'exécutent localement, et non sur le serveur distant en question:

$FBFolderName = "FB Demo" 
$Username = "user" 
$AllUsersRole = "DOMAIN\GTM All Users" 
$DomainUser= 'DOMAIN\' + $Username 

$s = New-PSSession -computerName server.domain.local 
$finalcommand = Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." 
Invoke-Command -Session $s -ScriptBlock { Import-module WebAdministration; $finalcommand } 
$finalcommand = Add-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." -value @{users="$DomainUser" access='Read,Write,Source';path='*'} 
Invoke-Command -Session $s -ScriptBlock { $finalcommand } 
Remove-PSSession $s 

Lors de l'exécution non interactive, je reçois l'erreur suivante:

Remove-WebConfigurationProperty : Filename: 
Error: Unrecognized configuration path 'MACHINE/WEBROOT/APPHOST/FB Demo' 
At line:1 char:17 
+ $finalcommand = Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST ... 
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
+ CategoryInfo   : NotSpecified: (:) [Remove-WebConfigurationProperty], FileNotFoundException 
+ FullyQualifiedErrorId : System.IO.FileNotFoundException,Microsoft.IIs.PowerShell.Provider.RemoveConfigurationPropertyCommand 

Cela est logique en ce qu'il essaie de trouver une collection inexistante sur la machine locale.

Mes questions sont les suivantes:

  1. que je fais quelque chose de mal à permettre que cela fonctionne à distance?
  2. Avant d'essayer de développer cette méthode, j'utilisais psexec avec appcmd pour faire la même chose, ce qui fonctionne, mais psexec prend beaucoup de temps pour établir la connexion.
  3. Est-ce que je prends la mauvaise approche? et existe-t-il une meilleure méthode pour faire de même sur un serveur distant?

Répondre

0

Votre stockez votre commande dans une variable locale, qui est inconnue dans la session à distance:

$finalcommand = Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." 

Stockez toutes vos commandes dans un scriptblock:

$commandScriptBlock= { 
    Import-module WebAdministration 
    Remove-WebConfigurationProperty -pspath 'MACHINE/WEBROOT/APPHOST' -location "$FBFolderName/User/$Username" -filter "system.webServer/webdav/authoringRules" -name "." 
    } 

et appelez le scriptblock via:

Invoke-Command -Session $s -ScriptBlock $commandScriptBlock 

Comme alternative vous m Vous pouvez également passer le $finalcommand en tant qu'argument à la cmdlet Invoke-Command. Voir ce link pour plus d'informations sur la façon de procéder.

+0

Excellent. Merci Moerwald! J'ai dû faire d'autres recherches pour que tout fonctionne, et la réponse était une combinaison de vos deux suggestions. Je vais poster la solution complète comme une réponse pour ceux qui pourraient être confrontés au même problème. Merci encore! –

1

Pour ceux qui sont curieux de la solution complète. S'il vous plaît voir ci-dessous.

La syntaxe de Add-WebConfigurationProperty et Add-WebConfigurationProerty était assez fastidieuse. Astuce: Assurez-vous de ne pas ajouter par inadvertance un "/" à la fin de MACHINE/WEBROOT/APPHOST. Cela vous rendra fou avec des erreurs trompeuses.

$ServerFQDN = "server.domain.local" 
$FBFolderName = "FolderName" # This is the name of your IIS Site 
$Username = "User" 
$DomainUser = "DOMAIN\User" 
$s = New-PSSession -computerName $ServerFQDN 
    $commandScriptBlock = { 
     Import-Module WebAdministration 
     Write-Host "Setting WebDAV Permissions ..." 
     Try { 
      Remove-WebConfigurationProperty -ErrorAction SilentlyContinue -pspath "MACHINE/WEBROOT/APPHOST" -Location "$($args[0])/User/$($args[1])" -Filter "system.webServer/webdav/authoringRules" -name "." 
      Write-Host -NoNewline " Removing All Users from Authoring Rules ..." 
      Write-Host -ForegroundColor Green " [ OK ]" 
     } 
     Catch { 
      Write-Host -NoNewline " Removing All Users from Authoring Rules ..." 
      Write-Host -ForegroundColor Red " [ ERROR ] " 
      Write-Output $($_.Exception.Message) 
     } 

     Try { 
      Add-WebConfigurationProperty -ErrorAction SilentlyContinue -pspath "MACHINE/WEBROOT/APPHOST" -Location "$($args[0])/User/$($args[1])" -Filter "system.webServer/webdav/authoringRules" -name "." -value @{users="$($args[2])";access='Read,Write,Source';path='*'} 
      Write-Host -NoNewline " Adding user $($args[2]) to Authoring Rules ..." 
      Write-Host -ForegroundColor Green " [ OK ]" 
     } 
     catch { 
      Write-Host -NoNewline " Adding user $($args[2]) to Authoring Rules ..." 
      Write-Host -ForegroundColor red " [ ERROR ] " 
      Write-Output $($_.Exception.Message) 
     } 
    } 
    Invoke-Command -Session $s -ScriptBlock $commandScriptBlock -ArgumentList $FBFolderName,$Username,$DomainUser 
    Remove-PSSession $s