如何解决在远程机器上检索 LoggedOnUsers
我正在构建一个 C# 应用程序,以使用 WMI 和 WQL 查询监控服务器和工作站工作负载。我正在使用 WMI,因为与 powershell 查询相比,它似乎更快。当我尝试在远程机器上检索登录用户时,我的困难就开始了。我想我需要使用 Win32_LoggedOnUser 类。我尝试了以下查询:
@"SELECT * FROM Win32_LoggedOnUser"
@"SELECT Antecedent FROM Win32_LoggedOnUser"
我习惯于像这样检索所需的值:
var cims = connection.getCimInstances(this,queryUser);
if (cims != null)
{
foreach (CimInstance cim in cims)
{
Komponenten.User user = new Komponenten.User();
user.Name = Convert.ToString(cim.CimInstanceProperties["Name"].Value);
users.Add(user);
}
}
其中 queryUser 是上面的字符串之一。
在这两种情况下,我都会得到一个 Win32_Account 对象作为回报,这似乎暗示 - 并且调试器似乎确认 - 我应该在返回的 {{1}再次上课。但这根本行不通。关于如何访问存储在 CimInstanceProperity 中的 Win32_Account 的 CimInstanceProperties 的任何想法?我无法在相应的 Windows 参考页面 (https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-loggedonuser) 上或在我广泛的 google 搜索中找到任何内容。
谢谢!
解决方法
在将 Antecedent - Object 转换为字符串后,我最终使用 ManagementObject-Class 和 Regex 来查找用户名:>
var users = new List<Komponenten.User>();
var searcher = this.connection.makeQuery(this,"SELECT * FROM Win32_LoggedOnUser");
if (searcher != null)
{
foreach (ManagementObject queryObj in searcher.Get())
{
Komponenten.User user = new Komponenten.User();
var win32_account = queryObj["Antecedent"].ToString();
string stripped = Regex.Replace(win32_account,"[^a-zA-Z=]+","",RegexOptions.Compiled);
int end = stripped.LastIndexOf("=");
user.Name = stripped.Substring(end+1);
users.Add(user);
}
this.users = users;
考虑到 LogonSession 的替代方法是:
var users = new List<Komponenten.User>();
var searcher = this.connection.makeQuery(this,"SELECT LogonId FROM Win32_LogonSession Where LogonType=2");
var Scope = this.connection.getScope(this,this.connection.getConnection());
if (searcher != null)
{
foreach (ManagementObject queryObj in searcher.Get())
{
ObjectQuery LQuery = new ObjectQuery("Associators of {Win32_LogonSession.LogonId=" + queryObj["LogonId"] + "} Where AssocClass=Win32_LoggedOnUser Role=Dependent");
ManagementObjectSearcher LSearcher = new ManagementObjectSearcher(Scope,LQuery);
foreach (ManagementObject LWmiObject in LSearcher.Get())
{
Komponenten.User user = new Komponenten.User();
user.Name = Convert.ToString(LWmiObject["Name"]);
users.Add(user);
}
}
this.users = users;
}
其中 this.connection.getConnection 是一个 ConnectionsOption 对象,具体取决于您各自的域和帐户数据
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。