如何针对 windows 服务器 WinRM 运行 编写脚本
How to run script against windows servers WinRM
我正在尝试 运行 searches/downloads/installs windows 使用 WinRM 在远程计算机上更新的脚本。我 运行 以具有管理员访问权限的域用户身份使用此脚本。但是,我收到拒绝访问错误。
现在,我已将脚本复制到远程服务器,但无法查看输出以确定脚本是否 运行ning。
我想看的输出:
# Continue running on other servers on error
$ErrorActionPreference = "Continue"
# Server list
$servers = Get-Content "C:\Users\admin\Desktop\vm-nonprod.txt"
# Logs
$log = "C:\Users\admin\Desktop\log-nonprod.txt"
# Path to script on server list
$scriptpath = "C:\Patch.ps1"
$results = @()
foreach ($server in $servers) {
try {
$Credential = Import-CliXml -Path "C:\Users\admin\Desktop\admin.Cred"
#New-PSSession -ComputerName $server -Credential $Credential
Invoke-Command -ComputerName $server -Credential $Credential -ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt
#Invoke-Command -ComputerName $server -Credential hhq\admin -FilePath "C:\Users\admin\Documents\Patch.ps1"
#Copy-Item -Path C:\Users\admin\Documents\Patch.ps1 -Destination 'C:\' -ToSession (New-PSSession –ComputerName $server -Credential $Credential)
}
catch {
Write-Output ("Error running script on remote host: " + $server)
}
}
$results | Export-Csv -NoTypeInformation $log
我相信您注释掉了错误的 Invoke-Command。 运行ning 的凭据参数中只有用户名 hhq\admin。它可能因此而失败,因为它会在 运行 时间内提示输入密码。
这里有一些问题。
- 服务器上是否存在该脚本?
听起来是的,每个 $server
上的 C:\
中都有 Patch.ps1
- 脚本块不 运行 脚本 - 只打印变量。
要运行它,将{$scriptpath}
更改为{. $scriptpath}
或{& $scriptpath}
变量 $scriptpath
不在脚本块范围内 - 您必须在 -ArgumentList
中传递它
变化:{$scriptpath} -ArgumentList "Y"
____To: {param($p); . $p} -ArgumentList $scriptpath
参数 "Y" 正在传递给脚本块,而不是脚本。脚本块没有在寻找它,所以这个值正在丢失。
假设您希望将其传递给脚本——这需要在脚本块中完成:
{$scriptpath "Y"}
我建议去掉 Out-File
,直到您对控制台中的输出满意为止。
综合起来:
-ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt
-ScriptBlock {param($p); . $p "Y"} -ArgumentList $scriptpath
我正在尝试 运行 searches/downloads/installs windows 使用 WinRM 在远程计算机上更新的脚本。我 运行 以具有管理员访问权限的域用户身份使用此脚本。但是,我收到拒绝访问错误。
现在,我已将脚本复制到远程服务器,但无法查看输出以确定脚本是否 运行ning。
我想看的输出:
# Continue running on other servers on error
$ErrorActionPreference = "Continue"
# Server list
$servers = Get-Content "C:\Users\admin\Desktop\vm-nonprod.txt"
# Logs
$log = "C:\Users\admin\Desktop\log-nonprod.txt"
# Path to script on server list
$scriptpath = "C:\Patch.ps1"
$results = @()
foreach ($server in $servers) {
try {
$Credential = Import-CliXml -Path "C:\Users\admin\Desktop\admin.Cred"
#New-PSSession -ComputerName $server -Credential $Credential
Invoke-Command -ComputerName $server -Credential $Credential -ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt
#Invoke-Command -ComputerName $server -Credential hhq\admin -FilePath "C:\Users\admin\Documents\Patch.ps1"
#Copy-Item -Path C:\Users\admin\Documents\Patch.ps1 -Destination 'C:\' -ToSession (New-PSSession –ComputerName $server -Credential $Credential)
}
catch {
Write-Output ("Error running script on remote host: " + $server)
}
}
$results | Export-Csv -NoTypeInformation $log
我相信您注释掉了错误的 Invoke-Command。 运行ning 的凭据参数中只有用户名 hhq\admin。它可能因此而失败,因为它会在 运行 时间内提示输入密码。
这里有一些问题。
- 服务器上是否存在该脚本?
听起来是的,每个$server
上的 - 脚本块不 运行 脚本 - 只打印变量。
要运行它,将{$scriptpath}
更改为{. $scriptpath}
或{& $scriptpath}
变量
中传递它$scriptpath
不在脚本块范围内 - 您必须在-ArgumentList
变化:
{$scriptpath} -ArgumentList "Y"
____To:{param($p); . $p} -ArgumentList $scriptpath
参数 "Y" 正在传递给脚本块,而不是脚本。脚本块没有在寻找它,所以这个值正在丢失。
假设您希望将其传递给脚本——这需要在脚本块中完成:
{$scriptpath "Y"}
我建议去掉
Out-File
,直到您对控制台中的输出满意为止。
C:\
中都有 Patch.ps1
综合起来:
-ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt
-ScriptBlock {param($p); . $p "Y"} -ArgumentList $scriptpath