小编Dav*_*ske的帖子

从登录 ID 获取用户 SID(Windows XP 及更高版本)

我有一个 Windows 服务,当用户在本地或通过终端服务器登录时,它需要访问 HKEY_USERS 下的注册表配置单元。我在 win32_logonsession 上使用 WMI 查询来接收用户登录时的事件,我从该查询中获得的属性之一是 LogonId。为了确定我需要访问哪个注册表配置单元,现在我需要用户的 SID,它用作 HKEY_USERS 下的注册表项名称。

在大多数情况下,我可以通过像这样(在 C# 中)执行 RelatedObjectQuery 来获得它:

RelatedObjectQuery relatedQuery = new RelatedObjectQuery( "associators of {Win32_LogonSession.LogonId='" + logonID + "'} WHERE AssocClass=Win32_LoggedOnUser Role=Dependent" );
Run Code Online (Sandbox Code Playgroud)

其中“logonID”是会话查询中的登录会话 ID。运行相关对象查询通常会给我一个包含我需要的 SID 属性。

我对此有两个问题。首先,也是最重要的一点,RelatedObjectQuery 不会为使用缓存凭据登录、与域断开连接的域用户返回任何结果。其次,我对这个 RelatedObjectQuery 的性能不满意 --- 它可能需要几秒钟才能执行。

这是一个快速而肮脏的命令行程序,我把它放在一起来试验查询。这只是枚举本地机器上的用户,而不是设置接收事件:

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace EnumUsersTest
{
    class Program
    {
        static void Main( string[] args )
        {
            ManagementScope scope = new ManagementScope( "\\\\.\\root\\cimv2" );

            string queryString = "select * from win32_logonsession"; …
Run Code Online (Sandbox Code Playgroud)

.net c# windows wmi sid

5
推荐指数
1
解决办法
2万
查看次数

标签 统计

.net ×1

c# ×1

sid ×1

windows ×1

wmi ×1