WMI为何被挂起(suspend)

让我们看看如下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的管理员组,访问被拒绝。

 

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

 

不过,存在一个有趣的现象:如果host0host1都具有一个完全相同的本地管理员帐户,上述访问竟然是成功的。难道对于本地帐户,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")

但显然,如果要使用这种方式,你不能直接将密码暴露出来。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值