我如何在远程服务器上成功调用命令以添加 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
这确实有意义,因为它试图在本地计算机上查找不存在的集合。
我的问题是:
- 我是不是做错了什么允许它远程运行?
- 在尝试开发这种方法之前,我使用 psexec 和 appcmd 来做同样的事情,这很有效,但是 psexec 需要很长时间才能建立连接。
- 我是不是采取了错误的方法?有没有更好的方法在远程服务器上做同样的事情?
您正在将命令存储在远程会话中未知的局部变量中:
$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
我几乎没有看到关于与我的类似的问题,但是我认为 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
这确实有意义,因为它试图在本地计算机上查找不存在的集合。
我的问题是:
- 我是不是做错了什么允许它远程运行?
- 在尝试开发这种方法之前,我使用 psexec 和 appcmd 来做同样的事情,这很有效,但是 psexec 需要很长时间才能建立连接。
- 我是不是采取了错误的方法?有没有更好的方法在远程服务器上做同样的事情?
您正在将命令存储在远程会话中未知的局部变量中:
$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