我正在尝试通过调用Win32_Process类从 vbscript 中的远程 Windows 服务器上运行一个简单的 cmd 实用程序,如下所示:
serverIP = "10.0.0.3"
Set oWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & serverIP & "\root\cimv2:Win32_Process")
RunCommand = "cmd.exe /c echo hello >c:\hello.txt"
wscript.echo RunCommand
intReturn = oWMI.Create(RunCommand, Null, Null, intProcessID)
wscript.echo intReturn
Select Case intReturn
Case 0 Wscript.Echo "Successful"
Case 2 Wscript.Echo "Access denied"
Case 3 Wscript.Echo "Insufficient privilege"
Case 8 Wscript.Echo "Unknown failure"
Case 9 Wscript.Echo "Path not found"
Case 21 Wscript.Echo "Invalid parameter"
Case Else Wscript.Echo "Unable to execute for unknown reason"
End Select
这总是因 privs 不足而失败(返回代码 3)。
谁能看到我做错了什么?该脚本是从作为域管理员调用的 cmd 会话中运行的,因此它应该可以正常工作,除非我不完全了解有关 WMI 安全性的某些内容。
可能会有人建议PSEXEC。我意识到了这一点,并且可能会退回到它。但这似乎是一个可以解决的问题,我不想为此脚本创建对外部可执行文件的依赖关系。
我会提到一些我尝试过的事情。
- 这个家伙说,如果没有加载配置文件,可能会出现问题。即使调用用户(域管理员)登录到两个系统,我也会遇到同样的问题。
- 在这个线程中,Richard Mueller 指出应该同时指定 impersonationlevel=impersonate 和 authenticationlevel=Pkt。我试过了。还是不行。
- 在此页面上,似乎应该指定名字对象中所需的NT 权限。我已尝试指定 SeInteractiveLogonRight、SeNetworkLogonRight、SeBackupPrivilege、SeRestorePrivilege、SeDebugPrivilege 和 SeChangeNotifyPrivilege。没有任何效果。
我在谷歌搜索时注意到的一个共同点是,人们在某些目标计算机上看到了这个问题,但在其他计算机上却没有。所以在我看来,根本上缺少的是完成这项任务所需的安全权限的全面分解。棒棒糖将不胜感激地发送给任何可以明确提供此类故障的人!
徒劳地希望它会增加收视率,我将在此处添加 .net 标签,因为 .net 人员经常处理相同的 WMI 问题并且可能有洞察力。
哇。Bump,这不会变成风滚草吧?