我在远程计算机上不是管理员的用户的安全上下文中对远程计算机运行以下 WMI 查询。
select * from Win32_LogonSession where LogonType = 2
该查询不返回 Win32_LogonSession 的任何实例。(请注意,如果我以管理员身份运行相同的查询,我会取回当前登录的用户,这是我的目标。)
我已按照 Technet 上的说明为该用户启用远程 WMI/DCOM 访问(通过运行以下查询进行验证,该查询返回 LogonType = 3 的 Win32_LogonSession 实例)。
select * from Win32_LogonSession
这是我正在运行的 C# 代码的完整示例:
var scope = new ManagementScope("\\\\SERVER\\root\\cimv2")
{
Options =
{
Impersonation = ImpersonationLevel.Impersonate,
Password = "myPassword",
Username = "DOMAIN\\myUser"
EnablePrivileges = true,
Authentication = AuthenticationLevel.Packet
}
};
scope.Connect();
var query = new ObjectQuery("select * from Win32_LogonSession where LogonType = 2");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
var managementObjects = searcher.Get();
// managementObjects is empty!
}
为什么即使用户有足够的访问权限远程查询 WMI,该用户也只会收到 Win32_LogonSession (LogonType = 3 - 网络) 的某些实例,而不会收到其他实例(例如,LogonType = 2 - 交互式)?
一些附加信息:根据代码项目上的这篇文章,只有 LocalSystem 帐户有足够的访问权限来查询所有登录会话:
枚举代码项目的登录会话
这似乎并不完全正确,因为成为本地管理员组的成员似乎就足够了。但也许这意味着存在一个未记录的限制,阻止一个人在不授予完全管理权限的情况下授予对 WMI 对象的权限?