如何针对 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。它可能因此而失败,因为它会在 运行 时间内提示输入密码。

这里有一些问题。

  1. 服务器上是否存在该脚本?
    听起来是的,每个 $server
  2. 上的 C:\ 中都有 Patch.ps1
  3. 脚本块不 运行 脚本 - 只打印变量。
    要运行它,将{$scriptpath}更改为{. $scriptpath}{& $scriptpath}
  4. 变量 $scriptpath 不在脚本块范围内 - 您必须在 -ArgumentList

    中传递它

    变化:{$scriptpath} -ArgumentList "Y"
    ____To: {param($p); . $p} -ArgumentList $scriptpath

  5. 参数 "Y" 正在传递给脚本块,而不是脚本。脚本块没有在寻找它,所以这个值正在丢失。
    假设您希望将其传递给脚本——这需要在脚本块中完成:
    {$scriptpath "Y"}

  6. 我建议去掉 Out-File,直到您对控制台中的输出满意为止。


综合起来:

-ScriptBlock {$scriptpath} -ArgumentList "Y" | Out-File -FilePath C:\Users\admin\Desktop\WinPatch.txt

-ScriptBlock {param($p); . $p "Y"} -ArgumentList $scriptpath