无法通过WMI

时间:2018-02-20 16:10:45

标签: wmi admin

我试图通过已经工作了几年的非常简单的代码来枚举Windows电源计划。但是,在我的Windows 10 64位计算机上,当我尝试枚举一组电源计划时,我遇到了错误。

我意识到Visual Foxpro代码就像一个化石,但它仍然很容易阅读:

loSchemes = CREATEOBJECT("Collection")  
loWMIService = GETOBJECT("winmgmts:\\.\root\cimv2\power")
loItems = loWMIService.ExecQuery("SELECT * FROM Win32_PowerPlan")
FOR EACH loItem IN loItems
    loSchemes.Add(loItem)
ENDFOR

代码已经工作多年了,从Windows XP到(我认为,无论如何),Windows 10。

通过loItems方法调用实例化ExecQuery()后发生错误。该对象存在并具有可见属性,但如果我尝试访问调试器中的任何内容,则表示无法计算表达式。如果我在TRY..CATCH中包装迭代的FOR循环,我得到的错误是:

  

OLE错误代码0x80070668:只有管理员才有权添加,   在终端服务远程期间删除或配置服务器软件   会话。如果要在服务器上安装或配置软件,   联系您的网络管理员。

所以,看起来我被锁定了电源计划信息,因为该进程认为我正在远程尝试更改配置,即使我正从本地计算机访问WMI数据(我确实拥有管理员权限)

我从Code Plex下载了一个“WMI Explorer”工具,当我尝试迭代Win32_PowerPlan时,我实际上遇到了同样的问题。日志返回错误:

  

无法枚举Win32_PowerPlan中的实例。 ERROR:

(这是文字回复 - 没有列出实际错误。)

这让我觉得这不仅仅是某种Foxpro问题。

修改

我从Sapien下载了一个WMI进程资源管理器,每次启动时都会显示一个UAC提示符,并以提升的权限运行它。该软件的32位和64位版本都可以查询Win32_PowerPlan并显示结果。然后我以管理员身份运行Code Plex WMI资源管理器,它也可以无错误地迭代Win32_PowerPlan。因此,该问题似乎与“位”无关,并且与WMI数据访问需要管理员权限有关,即使我使用实际上具有管理员权限的登录在本地运行。毋庸置疑,我仍然难过......为了记录,我仍然可以通过WMI访问各种其他信息:处理器信息,内存使用,进程,服务,IP地址和操作系统描述。所有这些模块仍然可以完美运行。但是当谈到\root\cimv2\power命名空间并访问电源计划时,没有快乐。

进一步编辑

其他一些问题提到ImpersonationLevel,说我可能需要将级别明确设置为“impersonate”(枚举常量= 3)。我正在使用我的WMIService对象,可以读取和写入模拟级别,但默认情况下为3。我把它提升到4(“代表”)仍然无法访问电源计划项目。查询运行正常,但当我尝试访问loItems的任何属性时会引发错误。如果我将模拟级别降低为1(“匿名”),则会在ExecQuery()调用中抛出“拒绝访问”错误。最后,级别2(“identify”)允许查询,我可以访问Count属性而不会抛出错误。但是应该有5个项目返回。我现在比以前更加困惑。

总之,即使我拥有管理员权限,我也无法从本地计算机访问电源计划信息。这是在Windows 10 Professional 64位安装(所有更新都是最新的),绝对没有安装终端服务器软件。

0 个答案:

没有答案