最初发布到 Stack Overflow,然后被引导到这里。我是编程新手,正在尝试编写一个 powershell 脚本来管理软件更新。我处于一个有 50 多个远程办公室的 Windows 域环境中。每个办公室有 4 台计算机。一台计算机“计算机 A”安装了 Dropbox,我们用它来备份,现在还用它来更新软件。我想从我的本地计算机执行一个脚本,将一个文件夹(~1 GB)复制到该 LAN 中的其他计算机,并运行目录中的 setup.exe 文件来更新这些计算机上的软件。
据我所知,为了使用 Enter-pssession cmdlet 并运行复制项并启动进程,我必须:
- 在远程计算机上通过以下方式启用 winrm:enable-psremoting -force
- 在远程计算机上启用 CredSSP 身份验证:enable-smancredssp -role server -force
- 在本地机器上启用 CredSSP 身份验证:enable-SmanCredSSP -role client -force
从这里我可以进入 Power shell 会话并开始复制和安装。这是我正在运行的代码:
#Allow my computer to send credentials to remote computers
Enable-WSManCredSSP -Role Client -DelegateComputer * -Force
$credential = Get-Credential -Credential domain\user
#Getting Content
$path = "C:\computernames.csv"
Import-Csv -path $path |
foreach-object {
$computername = $_.Name
if (Test-Connection -cn $_.Name -quiet) {
#copy the batch file that allows remote powershell access
$source = "c:\"
$destination = "\\$computername\c$\install files\remoteaccess"
robocopy $source $destination
#open file to allow remote PS access
& psexec \\$computername -a runas -u domain\user -p password -c -f -h "\\$computername\c$\install files\remoteaccess\remoteaccess.bat"
#Initiates Power Shell session with remote computer
Enter-PSSession -cn $_.Name -Credential $credential -Authentication Credssp
#begin copy
#be sure to refine destination
copy-item -path $_.Source -Destination $_.Destination -force -verbose -recurse | out-file c:\copylog.txt
#begin silent install
#code here
#stop wsmancredssp accep
disable-wsmancredssp -role server
#close pssession
exit-pssession
} else {
"$computername is not online"
}
}
Disable-wsmancredssp -role client
computernames.csv 包含标题:名称、来源、目标,以及每个 LAN 计算机的 UNC 目录(带有 dropbox)和文件复制位置。
“remoteaccess.bat”文件包含以下两行代码:
powershell.exe enable-psremoting -force >>c:\remotelog.txt
powershell.exe Enable-WSManCredSSP -role Server -force >>c:\remotelog.txt
在启动与远程计算机的 psexec 会话后,powershell 窗口冻结,并发送第一个 powershell 命令以启用远程处理。没有生成错误,也没有请求输入。此命令的输出保存在 remotelog 文本文件中:“WinRM 已更新以接收请求。WinRM 服务已启动。
WinRM 已在此机器上设置远程管理。”
似乎从未收到启用 wsmancredssp 的 powershell 命令。当我从远程访问软件在远程计算机上运行批处理文件时,两个命令都执行并成功记录。我的 psexec 命令哪里出错了,或者我如何设置这些计算机以允许使用远程命令进行远程会话而不使用 GPO?
答案1
代码在很多方面都不对劲:
- 如果您处于 Windows 域环境中,为什么不通过 GPO 启用 Powershell 远程处理?
- Enter-PSSession 是用于交互式远程会话的命令,您正在寻找的是带有会话参数的 New-PSSession 和 Invoke-Command
- 仅当你想从你连接的远程系统访问远程系统时才需要 CredSSP
- 为什么要将 1GB 的数据复制到分支机构?与总部的连接是否太不稳定?
- robocopy 命令将 C:\ 中的所有内容复制到远程目的地,这绝对不是您想要的(pagefile.sys、bootmgr 等)。