我如何在远程服务器上成功调用命令以添加 WebConfigurationProperty

How can i invoke-command successfully on a remote server to Add-WebConfigurationProperty

我几乎没有看到关于与我的类似的问题,但是我认为 WebAdministration 模块 cmdlet 中可能有更多的歧义。

我想做什么: 在远程服务器上执行以下命令:

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='*'}

当我 运行 它们在服务器本身上时,它们工作得很好,当我 运行 它们以交互方式创建 New-PSSession

时,它们也工作得很好

当我以非交互方式 运行 以下脚本时,我收到的错误似乎表明这些指令是 运行 在本地执行的,而不是在相关的远程服务器上:

$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 

当 运行非交互地 ning 时,我收到以下错误:

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

这确实有意义,因为它试图在本地计算机上查找不存在的集合。

我的问题是:

  1. 我是不是做错了什么允许它远程运行?
  2. 在尝试开发这种方法之前,我使用 psexec 和 appcmd 来做同样的事情,这很有效,但是 psexec 需要很长时间才能建立连接。
  3. 我是不是采取了错误的方法?有没有更好的方法在远程服务器上做同样的事情?

您正在将命令存储在远程会话中未知的局部变量中:

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

将所有命令存储在脚本块中:

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

并通过以下方式调用脚本块:

Invoke-Command -Session $s -ScriptBlock $commandScriptBlock

作为替代方案,您也可以将 $finalcommand 作为参数传递给 Invoke-Command cmdlet。有关如何执行此操作的更多信息,请参阅此 link

对于那些对完整解决方案感到好奇的人。请看下面。

Add-WebConfigurationProperty 和 Add-WebConfigurationProerty 的语法非常乏味。提示:确保不要无意中在 MACHINE/WEBROOT/APPHOST 的末尾添加“/”。它会让你因误导性错误而发疯。

$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