使用c#在本地注销Windows用户

时间:2013-01-22 19:22:55

标签: c# .net windows windows-xp

我目前正在研究一些家长控制软件。该软件应该注销用户,然后锁定帐户,以便他们无法重新登录,除非父/管理员已指定他们可以。

到目前为止,我已尝试了几项操作,例如在用户帐户上设置标记,表示已禁用。这会将其从登录屏幕中完全删除。根据我的发现,如果用户帐户已登录,则不会应用ADS_Disable标志。我也尝试寻找登出其他帐户的资源,但我似乎只能找到有关注销正在运行logout命令的帐户的信息。例如Pinvoke,或直接调用LOGOUT.EXE程序。

我在LSAUser找到了一个资源,发现可能存在某些内容。我正在为学校做这个项目,我需要一点指导。由于关于这样做的信息量非常稀少,有没有更好的方法来做我想做的事情?或者我有理由不这样做吗?任何替代方案?

3 个答案:

答案 0 :(得分:9)

使用WTSDisconnectSession() Windows API。请参阅文章here

using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

class Program
{
  [DllImport("wtsapi32.dll", SetLastError = true)]
  static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);

  const int WTS_CURRENT_SESSION = -1;
  static readonly IntPtr WTS_CURRENT_SERVER_HANDLE = IntPtr.Zero;

  static void Main(string[] args)
  {
    if (!WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE,
         WTS_CURRENT_SESSION, false))
      throw new Win32Exception();
  }
}

即使没有远程桌面,它也会断开当前用户的连接并转到登录屏幕。这些流程仍将在后台运行。再次手动登录后,正在运行的程序将显示为断开连接之前的状态。

答案 1 :(得分:2)

  [DllImport("wtsapi32.dll", SetLastError = true)]
  static extern bool WTSDisconnectSession(IntPtr hServer, int sessionId, bool bWait);


在远程桌面中使用 WTSDisconnectSession 时,相当于“关闭”远程桌面窗口。它会断开您的Windows会话,但保持连接
优点是您可以稍后通过远程登录重新连接回会话 缺点是当远程桌面连接已满时,Windows可能无法由其他用户登录

要模拟Windows“注销”,请在user32.dll下使用 ExitWindowsEx

[DllImport("user32.dll", SetLastError = true)]
static extern bool ExitWindowsEx(uint uFlags, uint dwReason);

public static bool WindowsLogOff() {
  return ExitWindowsEx(0, 0);
}

如果您想强制用户注销,则需要添加EWX_FORCE标志,如下所示:

ExitWindowsEx(0 | 0x00000004, 0);

有关此功能的更多详细信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx

答案 2 :(得分:1)

撇开冷伟生的回答(因为我无法评论),如果你想强制用户注销你需要添加EWX_FORCE标志,如下所示:

ExitWindowsEx(0 | 0x00000004, 0);

有关此功能的更多详细信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx