WMI 权限:选择命令行,Win32_Process 的 ProcessId 没有返回命令行的数据

WMI 权限:选择命令行,Win32_Process 的 ProcessId 没有返回命令行的数据

我正在通过 WMI 收集性能数据,并希望避免为此目的使用管理员组中的帐户。目标计算机正在运行带有最新 SP/更新的 Windows Server 2003。

我已经完成了我认为适当的配置,以允许我们的用户访问 WMI(类似于此处描述的:http://msdn.microsoft.com/en-us/library/aa393266.aspx)。

以下是所遵循的具体步骤:

  1. 打开管理工具 -> 计算机管理:在计算机管理(本地)下展开服务和应用程序,右键单击 WMI 控制并选择属性。在安全选项卡中,展开根目录,突出显示 CIMV2,单击安全(靠近窗口底部);添加性能监视器用户并启用选项:启用帐户和远程启用。

  2. ­
  3. 打开“管理工具”->“组件服务”:在控制台根目录下,转到“组件服务”->“计算机”-> 右键单击​​“我的电脑”并选择“属性”,选择“COM 安全”选项卡,在“访问权限”中单击“编辑默认”,选择(或添加然后选择)“性能监视器用户”组并允许本地访问和远程访问,然后单击“确定”。在“启动和激活权限”中,单击“编辑默认”,选择(或添加然后选择)“性能监视器用户”组并允许本地和远程启动和激活权限。

  4. ­
  5. 打开管理工具->组件服务:在控制台根目录下,转到组件服务->计算机->我的电脑->DCOM 配置->突出显示“Windows 管理和仪表”右键单击并选择属性,选择安全选项卡,在“启动和激活权限”下选择自定义,然后单击编辑,添加“性能用户组”并允许本地和远程远程启动和远程激活权限。

我能够通过 WMI Explorer 远程连接,但是当我执行此查询时:

Select CommandLine, ProcessId FROM Win32_Process

我得到了有效结果,但每一行都有一个空的命令行。如果我将用户添加到管理员组并重新运行查询,命令行列将包含预期数据。

似乎我在某个地方遗漏了某个许可,但我没有太多运气去追踪它。

提前谢谢了。

答案1

在本地安全策略中授予“调试程序”用户权限允许访问 CommandLine/ExecutablePath 信息。虽然这比使用(本地)管理员帐户更好,但仍然会带来安全风险。这就是为什么我在这里发布了一个后续问题,看看是否可以用较低的权限来实现:

WMI 访问进程 CommandLine 的最低权限是什么?

答案2

我不认为这是一个权限问题,但也许是您的查询结构的微妙之处,我将通过我创建的执行此操作的代码来解释(以便能够稍后缓存命令行)。

在我的 CacheMyWork 应用程序代码中(您可以在这里浏览),我发出的具体查询(并且肯定会返回 CommandLine 结果)是

从 Win32_Process 中选择命令行,其中 ProcessId =

我已经有一段时间没有使用 WMI Explorer 了,但它可能只返回单个进程的命令行,而不是一次返回整个数组的命令行?不知道。

我已经使用这款应用三年了,虽然我现在不记得上次以非管理员用户身份测试它是什么时候,但我 99% 确信它在这种情况下一定能正常工作,因为成千上万的人下载了它,但还没有人报告说它在重启后没有重新启动缓存的应用。[是的,我知道那些假设的人会发生什么,但这并没有阻止我在这里做一个鲁莽的假设者。]

答案3

如此彻底地改变我对此的看法确实有点令人尴尬,但是您对我的第一次尝试的后续评论使得许可理论突然听起来更有说服力。

如今,Windows 已根据请求进程是远程还是本地而赋予不同的权限,这与我所见过的对象 ACL 行为非常相似,即允许 INTERACTIVE 但不允许 REMOTE。当您通过 RDP 登录时,您的访问令牌将包含 INTERACTIVE SID;当您执行远程查询(使用 RPC,通常通过命名管道或直接 TCP/IP 进行)时,您的访问令牌不包含 INTERACTIVE,而是包含 REMOTE。此外,我还见过两次不同的访问尝试或登录会话最终以某种方式“汇集”其组合访问权限的情况,因此您所说的“当我登录时,远程 WMI 查询也会成功”实际上有些道理。我必须重新阅读 Windows Internals 才能了解会话、WinStations 或访问令牌是否真的被共享,但您报告的内容肯定与我的一些经历一致。

没有充分的理由说明为什么 CommandLine 属性的 ACL 应该与 ProcessID 属性不同,但看起来确实如此。希望我知道这是不是可以通过深度嵌入的配置设置来更改的,还是只是在 Windows 操作系统中硬编码的。

我回顾了您在原始问题中概述的权限更改步骤,并且有两个地方似乎出现了本地/远程差异:

  • (2)组件服务 > COM 安全 > 启动和激活权限 - INTERACTIVE 被授予完全权限
  • (3)组件服务> DCOM 配置> Windows 管理和仪表> 安全> 启动和激活权限 - 无论您是本地还是远程,“启动”和“激活”都提供不同的权限。

我会将你的调查重点放在这些领域以及你注意到这种本地/远程(交互式/远程)差异权限的任何其他领域。虽然这些都不能明确指向你追求的 CommandLine 属性,但在我看来,几乎可以肯定(是的,甚至比我之前的回答更确定)这些差异将解释你所看到的行为,缩小“远程”和“本地”之间的差距将实现你所寻求的结果。[我们只希望微软没有对某些东西进行硬编码,这样无论你配置什么,你都无法将 CommandLine 属性暴露给远程查询。这不是第一次短视的硬编码设计让我们无法使用他们的操作系统……]

答案4

哦,抱歉,这是一个老问题,但我认为如果有人遇到类似的问题,这会有所帮助:

请尝试以下操作:

不要使用“性能监视器用户”,而是尝试使用“性能日志用户”执行您的第 1 步,并仅允许“性能日志用户”组使用“执行方法”和“远程启用”。并将权限应用于“此命名空间和下属命名空间”。不要忘记将您的用户添加到新组...

我遇到了类似的问题(但其他 WMI 类),它与“性能日志用户”组一起工作,但与“性能监视器用户”不一起工作...

希望这对你也有用...

ps 在 win08 或更高版本上,如果您认为您可以保留步骤 2 或 3。但我不知道 win03 是否需要它们。

相关内容