您的位置:首页 > 其它

WMI为何被挂起(suspend)

2008-12-22 13:42 85 查看
让我们看看如下vbscript中的WMI调用,
set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}//host1/root/default:StdRegProv")

它的作用是获取host1机器的注册表provider对象,当前机器为host0,为了简化问题,它们在一个域中。既然是远程操作,就不可避免涉及到访问用户的权限。如果访问用户在host1的管理员组中,那么这一操作应当是成功的。
我们注意到上面的调用使用了impersonate,意味着调用者的身份信息将被用来访问远端注册表。那么这个调用者即是该脚本的宿主。我们尝试下面两种方式:
方式一:使用wscript.exe来执行该脚本。我们可以使用run as来让该程序运行在不同的用户下。结果是,如果该用户不位于host1的管理员组,访问失败。关于如何让程序运行在local system帐户(LSA)的方法,请参见“让程序运行在local system帐户(LSA)下”一文。
方法二:该脚本位于一个ASP页面中,即:IIS做为宿主。在IIS6.0下,我们利用appilcation pool的特性来改变其运行帐户。而且,当运行在local system下时,该帐户将使用当前登录用户的信息。所以,如果当前登录用户不在host1的管理员组,访问被拒绝。

正常情况下,两种方式下是一致的。

不过,存在一个有趣的现象:如果host0和host1都具有一个完全相同的本地管理员帐户,上述访问竟然是成功的。难道对于本地帐户,WMI将尝试作为远端机器的本地帐户?这里还有一个条件,就是是否在vbscript中添加错误恢复语句on error resume next。在wscript.exe方式下,即使不添加该语句,也能成功执行;而在IIS方式下,如果不添加该语句,则执行被挂起,添加了该语句,却可以顺利执行。

另外,顺便提一下,还有另外一种WMI的调用方式,可以指定某个帐户,类似:
Set objSWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServices = objSWbemLocator.ConnectServer(“host1”, "root/default", "host1/administrator", "123456")
objSWbemServices.Security_.ImpersonationLevel = 3
set objReg = objSWbemServices.Get("StdRegProv")
但显然,如果要使用这种方式,你不能直接将密码暴露出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐