我有许多服务器需要推动此补丁。通常我会加载 WSUS 或同等版本。但是我想在 DSC 环境中运行它。所以我正在测试脚本以用于此工作流程。
PowerShell 抱怨它找不到文件夹。
Copy-Item $HostedRegFile -Destination $newfile "unauthorized"
显然我没有正确传递凭据。我已经尝试了所有我能想到的方法,从使用会话到不使用会话。
$servers = Get-Content "d:\Powershell\Servers.txt"
$Session = New-PSSession -computername $servers -credential $MyCredential
$HostedRegFile = "\\Contra2\D:\reg\Player2.reg"
foreach ($server in $servers)
{
#$Session = New-PSSession -computername $server -credential $MyCredential
$newfile = "\\$server\c$\Utils\"
New-Item -ErrorAction SilentlyContinue -ItemType directory -Path \\$server\C$\Utils\
Copy-Item $HostedRegFile -Destination $newfile
Invoke-Command -computername $server -ScriptBlock {
Start-Process -filepath "C:\windows\regedit.exe" -argumentlist "/s C:\Utils\Player2.reg"
}
}
我做错了什么? 有没有更好的方法(总是有的)?
答案1
$HostedRegFile
似乎是 UNC 路径,但路径中有冒号。您需要更改D:
为D$
失败
regedit
是因为它在启动时提示 UAC,但您没有使用 GUI 来确认和允许这一点。要允许 UAC 启动,请添加-verb runas
到Start-Process
调用中。如果最终目标是通过 DSC 运行,则需要创建一些域中的计算机帐户可以访问的普通共享。域计算机无权访问 D$ 和 C$ 等管理共享。
为了避免 regedit 和 UAC 问题,请使用本机 powershell cmdLets:
Set-ItemProperty -Path HKLM:\Software\XYZ -Name Color -Value Blue -Type String
-Type 也可以是 DWORD、QWORD、Binary、ExpandString也可以通过 GPO 推送注册表项。
答案2
这就是我最终得到的结果。
当然,在此之前必须先处理好 UAC 和 WinRM。
$servers = Get-Content "d:\Powershell\Servers.txt"
$HostedRegFile = "\\Contra2\D$\reg\Player2.reg"
foreach ($server in $servers)
{
$Session = New-PSSession -computername $server -credential $MyCredential
Copy-Item -Path "$RegFile" -Destination "C:\Utils\" -force -ToSession $session
Invoke-Command -session $session -ScriptBlock
{
regedit /i /s C:\Utils\Player2.reg"
}
}