我一直在尝试设置一个Powershell模块,该模块可以使用Invoke-Command远程调用服务器上的Windows / Microsoft更新,然后处理更新,并将所有内容发送回调用服务器,以便它可以发送电子邮件报告。
当我尝试调用下载程序时出现问题:Powershell似乎在远程计算机上请求提升权限。
以下是我尝试运行和失败的内容片段:
Invoke-Command -ComputerName $Server -Credential $Credentials -ScriptBlock {
$UpdateSession = New-Object -ComObject "Microsoft.Update.Session"
Write-Progress -Activity "Updating" -Status "Checking for new updates"
$Criteria = "IsInstalled=0 and Type='Software'"
$Updates = $UpdateSession.CreateUpdateSearcher().Search($Criteria).updates
$Downloader = $UpdateSession.CreateUpdateDownloader()
$Downloader.Updates = $Updates
}
我知道问题不在于远程处理,因为前4个命令工作正常。
$Credentials
变量指向预定义的凭据,即远程服务器上的本地管理员。
当脚本到达第5行$Downloader = $UpdateSession.CreateUpdateDownloader()
时,我从Powershell收到此错误:
Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
+ CategoryInfo : OperationStopped: (:) [], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException
+ PSComputerName : SERVER.sidlee.inc
究竟是什么造成这种情况?
提前感谢您的帮助!
答案 0 :(得分:0)
由于我刚刚碰到同一堵墙,谷歌也没有多大帮助,这就是我可以挖掘的东西。
为了记录,我几乎都在做同样的事情(使用自定义PS代码来检查远程系统的Windows更新)但是使用WinRM而不是Invoke-Command
而且还卡在Microsoft.Update.Searcher.Search()
上抛出E_ACCESSDENIED
错误。
UnauthorizedAccessException
确实与Powershell无关,而与底层API无关。
我怀疑微软在最近的一些更新(Powershell v5?)中开始切断远程会话中的模拟,因为这在旧版Windows版本(例如,带有Powershell v3的Server 2012或带有v4的2012 R2)上工作正常(并且仍然如此)
为了解决这个问题,你需要在使用PSCredential
对象执行你的东西之前(在远程服务器上)进行身份验证。
所以Remote Auth -> Local Auth -> Run stuff
例如使用Start-Process -Credential ...
e.g。
$pass = ConvertTo-SecureString "PA$$W0RD" -AsPlainText -Force
$creds = New-Object System.Management.Automation.PSCredential "User", $pass
Start-Process -Credential $creds powershell -ArgumentList "-Command & { ... whatever you want to do ... }"
请注意,这会带来安全风险,因为您的密码将以明文形式进行解析,因此请勿在 未加密的频道!