1

今天我有同样的问题,我找不到解决方案,在 WEB 阅读大量文章中搜索但没有成功。我在远程机器上运行 PowerShell 脚本的问题。如果我在本地运行这个脚本——它可以工作,但远程不行。

这是我的全部故事。

服务器:
Windows 2008 R2 SP1 + 最新更新
FW – 关闭
UAC - 开:
- 用户帐户控制:对内置管理员帐户使用管理员批准模式 - 禁用
- 用户帐户控制:允许 UIAccess 应用程序在不使用安全桌面的情况下提示提升。– 禁用
- 用户帐户控制:管理员批准模式下管理员的提升提示行为 - 提升而不提示
- 用户帐户控制:检测应用程序安装并提示提升 - 禁用
域名:hardening.com
主机名:qwerty12345

已安装 PowerShell 版本:

PS C:\Windows\system32> $PSVersionTable

名称 值
---- -----
CLRVersion 2.0.50727.5420
构建版本 6.1.7601.17514
PS版本 2.0
WSManStack 版本 2.0
PSCompatibleVersions {1.0, 2.0}
序列化版本 1.1.0.1
PSRemotingProtocolVersion 2.1


客户:
Windows 2008 R2 + 最新更新
FW – 关闭
UAC - 开:
- 用户帐户控制:对内置管理员帐户使用管理员批准模式 - 禁用
- 用户帐户控制:允许 UIAccess 应用程序在不使用安全桌面的情况下提示提升。– 禁用
- 用户帐户控制:管理员批准模式下管理员的提升提示行为 - 提升而不提示
- 用户帐户控制:检测应用程序安装并提示提升 - 禁用
域名:systemqa.com

已安装 PowerShell 版本:

PS C:\> $PSVersionTable

名称 值
---- -----
CLRVersion 2.0.50727.4952
构建版本 6.1.7600.16385
PS版本 2.0
WSManStack 版本 2.0
PSCompatibleVersions {1.0, 2.0}
序列化版本 1.1.0.1
PSRemotingProtocolVersion 2.1


• 在客户端上还安装了 PowerCLI


1. 在服务器上,我有文件“C:\Windows\Temp\ ConfigurationWinRM.ps1”,内容如下:
winrm 设置 winrm/config/client `@`{TrustedHosts=`"`*`"`}
winrm 设置 winrm/config/winrs '@{MaxShellsPerUser="100"}'

2. 我的任务是在远程“服务器”机器上运行这些脚本。

3. 我从“客户端”机器运行以下脚本,但总是得到相同的错误:
消息 = 访问被拒绝。
错误号:-2147024891 0x80070005

一个。示例 1:
$domainCrd = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "$domainUser@$domainNameFQDN",$domainPASS
$ComputerName = "qwerty12345.hardening.com"

调用命令 -ComputerName $ComputerName -Credential $domainCrd -ScriptBlock {
    $FileName = "配置WinRM.ps1"
            $ItemLocation = "C:\Windows\Temp\"
            powershell -NoProfile -Command ".$ItemLocation$FileName"
}

湾。示例 2:
$ComputerName = "qwerty12345.hardening.com"

$securePassword = ConvertTo-SecureString "**********" -AsPlainText -force
$credential = 新对象 System.Management.Automation.PsCredential("$domainName\$domainUser",$securePassword)

调用命令 -ComputerName $ComputerName -ScriptBlock {
            $FileName = "配置WinRM.ps1"
            $ItemLocation = "C:\Windows\Temp\"
            powershell -Command ".$ItemLocation$FileName"

} -凭证 $凭证

C。示例 3:
[脚本块] $global:runFile = {

$FileName = "配置WinRM.ps1"
### $ItemLocation = "C:\Windows\Temp\"
$ItemLocation = "$env:windir\Temp\"

& "$ItemLocation$FileName"
}

RemotePowerShellConnect 域 $runFile


WSManFault
    + CategoryInfo : NotSpecified: (WSManFault:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

    消息 = 访问被拒绝。
错误号:-2147024891 0x80070005
访问被拒绝。
WSManFault
    消息 = 访问被拒绝。
错误号:-2147024891 0x80070005
访问被拒绝。
[vSphere PowerCLI] C:\> $error[0] | 格式列表 * -Force


PSMessage详细信息:
来源信息:qwerty12345.hardening.com
异常:System.Management.Automation.RemoteException:
                        错误号:-2147024891 0x80070005
                        访问被拒绝。

目标对象:
CategoryInfo : NotSpecified: (:) [], RemoteException
fullyQualifiedErrorId : NativeCommandErrorMessage
错误详情 :
调用信息:
管道迭代信息:{}



d。示例 4:
[vSphere PowerCLI] C:\> [脚本块] $global:www = {
$FileName = "配置WinRM.ps1"
$ItemLocation = "C:\Windows\Temp\"

函数调用管理(){
    参数 ( [string]$program = $(throw "请指定一个程序" ),
            [字符串]$argumentString = "",
            [开关]$waitForExit )

    $psi = 新对象“Diagnostics.ProcessStartInfo”
    $psi.FileName = $程序
    $psi.Arguments = $argumentString
    $psi.Verb = "runas"
    $proc = [Diagnostics.Process]::Start($psi)
    如果($waitForExit){
        $proc.WaitForExit();
    }
}

写入主机 -ForegroundColor 绿色“调用管理员 powershell $ItemLocation$FileName”
调用管理员 powershell $ItemLocation$FileName

}

[vSphere PowerCLI] C:\> RemotePowerShellConnect 域 $www
会话状态:已打开
会话可用性:可用
跑步
服务正在运行...
您连接到 VM 远程 PowerShell ...
Invoke-Admin powershell C:\Windows\Temp\ConfigurationWinRM.ps1
[vSphere PowerCLI] C:\>
[vSphere PowerCLI] C:\>

什么都没发生!!!!远程“服务器”机器上没有更新!!!

e. 示例 5:
.\tmp\psexec -d \\$hostNAME -u $domainName\$domainUser -p $myPASS cmd /C START /WAIT powershell %windir%\Temp\ConfigurationWinRM.ps1

PsExec v1.98 - 远程执行进程
版权所有 (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


cmd 在 qwerty12345 上启动,进程 ID 为 3860。
[vSphere PowerCLI] C:\>

什么都没发生!!!!远程“服务器”机器上没有更新!!!

4

1 回答 1

1

我是否正确地阅读了只有一个脚本文件,仅在本地服务器上,而不是在任何远程客户端上?

如果是这种情况,那么我认为您应该尝试以下语法:

$FileName = "ConfigurationWinRM.ps1"
$ItemLocation = "C:\Windows\Temp\"
Invoke-Command -ComputerName $ComputerName -filepath "$ItemLocation$FileName" -cred $credential

我认为使用 scriptblock 语法时发生的情况是:

  1. 在本地机器上定义的脚本块,封装为一个对象
  2. 传递给每台远程机器的脚本块对象
  3. scriptblock 在远程机器上逐字执行,因此它正在远程机器上的 c:\windows\temp 上查找您的脚本文件(它不存在,因此它会抛出一些 BS access denied 错误)

根据文件路径参数的帮助信息,使用 -filepath 将执行以下操作:

  1. 在本地读取脚本文件,将 内容转换为脚本块对象
  2. 传递给每台远程机器的脚本块对象
  3. 脚本块在远程机器上逐字执行,此时根本没有对 .ps1 文件的引用
于 2011-04-01T08:04:53.993 回答