总结:在另一台计算机上运行“get-wmiobject”可以正常运行。但是当我“调用命令”“get-wmiobject”时,我被拒绝访问。
详细信息:我的中心站点有一个工作站(计算机中心),我从中运行了一个库存脚本。库存脚本遍历所有远程站点上的每个IP的几个“get-wmi”命令。如果我以域管理员身份登录到Computer-Central,则脚本可以正常运行。
我现在在其中一个远程站点。我目前的工作站是(Computer-SiteA)。所以我无法直接登录Computer-Central;我必须使用RDP。问题是,RDP会话在脚本完成之前超时(大约需要12个小时)。所以我不能RDP,启动脚本,走开。出于各种原因,制定计划任务也是出局。
启用Powershell Remoting。我使用我的域管理员帐户登录到Computer-SiteA并运行以下命令:
invoke-command -computername Computer-Central {dir c:}
这很正常。所以我使用以下命令启动了库存脚本(再次,在Computer-SiteA上以域管理员身份运行):
invoke-command -computername Computer-Central -filepath c:\inventory.ps1
脚本启动并在一夜之间运行。但是get-wmi命令都产生了“拒绝访问”错误。 我RDP进入Computer-Central并运行以下命令:
get-wmiobject -class win32_computersystem -property name -computername Computer-SiteB
这很正常。我收到了WMI信息。
然后我登录到Computer-SiteA并运行以下命令:
invoke-command -computername Computer-Central {get-wmiobject -class win32_computersystem -property name -computername Computer-SiteB}
“拒绝访问”失败了。我以域管理员身份登录,甚至做了“以不同用户身份运行”以确保PS控制台作为我的域管理员帐户打开。
我很困惑。 “Invoke-Command”应该使用我在本地PC上使用的凭据启动远程系统上的Powershell.exe进程。 “get-wmiobject”命令应该使用相同的凭据将WMI查询从远程PC传递到目标PC。但事实似乎并非如此。
有什么想法吗?
编辑:我运行此命令以进行计算机中心查询。
invoke-command -computername Computer-Central {get-wmiobject -class win32_computersystem -property name -computername Computer-Central}
那很有用。如果我在远程系统上调用“get-wmiobject”作为目标,它就可以工作。如果我在针对第三个系统的远程系统上调用“get-wmiobject”,则会失败。我希望这会有所帮助。
答案 0 :(得分:3)
问题是您正在对远程计算机使用NTLM(Windows)身份验证,然后尝试连接到另一台计算机。这是经典的“双跳”问题:您在机器A上,对机器B进行身份验证,然后尝试从B连接到机器C(通过WMI。)
它适用于RDP,因为您使用RDP从A连接到B并为B提供您的用户名和密码(您实际上必须输入RDP。)此时,B可以使用NTLM连接到C 。当您不使用RDP时,您使用NTLM从A连接到B,然后您不能再次使用NTLM从B到C而不再提供您的用户名和密码。
值得庆幸的是PowerShell有一个解决方案,它被称为CredSSP身份验证。它确实需要一些额外的工作来设置,但是一旦完成,你就可以做你需要做的事情。这是一个很好的演练:
CredSSP将您的用户名和密码“隧道”从A到B,这样您就可以使用NTLM向C进行身份验证。当然,您必须重新输入您的凭据 - 它无法确定您从初次登录到A的密码(可能是您的桌面或笔记本电脑。)
希望这有帮助,