SystemEvents.SessionSwitch 用户被锁定/解锁

3
我正在使用SystemEvents.SessionSwitch事件来确定运行我的进程的用户是否被锁定,但该事件无法让你知道哪个用户被锁定/解锁。如何获取这个信息(从一个由低权限用户拥有的进程)?
1个回答

0

我认为你不能针对部分受信任的代码进行操作。如果您的应用程序或其某个部分可以成为完全信任的服务,则可以按照答案中指定的方式检索会话ID以回答相关问题

然后,根据会话ID,您可以找到具有该会话ID的任何进程以获取实际用户(从获取Windows进程所有者名称中抽象出来):

[DllImport ("advapi32.dll", SetLastError = true)]
static extern bool OpenProcessToken (IntPtr ProcessHandle, UInt32 DesiredAccess, out IntPtr TokenHandle);

[DllImport ("kernel32.dll", SetLastError = true)]
[return: MarshalAs (UnmanagedType.Bool)]
static extern bool CloseHandle (IntPtr hObject); 

static uint TOKEN_QUERY = 0x0008;

// ...

public static WindowsIdentity GetUserFromSession(int sessionId)
{
    return Process.GetProcesses()
        .Where(p => p.SessionId == sessionId)
        .Select(GetUserFromProcess)
        .FirstOrDefault();
}

public static WindowsIdentity GetUserFromProcess(Process p)
{
    IntPtr ph;
    try
    {
        OpenProcessToken (p.Handle, TOKEN_QUERY, out ph);
        return new WindowsIdentity(ph);
    }
    catch (Exception e)
    {
        return null;
    }
    finally
    {
        if (ph != IntPtr.Zero) CloseHandle(ph);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接