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

C# 使用c在本地注销Windows用户#,c#,.net,windows,windows-xp,C#,.net,Windows,Windows Xp,我目前正在开发一些家长控制软件。该软件应该注销用户,然后锁定帐户,以便他们无法重新登录,除非家长/管理员指定他们可以 到目前为止,我已经尝试了一些方法,比如在用户帐户上设置标志,表示它已被禁用。这会将其从登录屏幕中完全删除。从我发现的是,如果用户帐户登录,它不会应用ADS_禁用标志。我还尝试寻找注销另一个帐户的资源,但我似乎只能找到注销运行注销命令的帐户的信息。例如,或直接调用程序 我在上找到了一个资源,发现可能有什么东西。我正在为学校做这个项目,我需要一些指导。既然做这件事的信息如此稀少,有没

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

到目前为止,我已经尝试了一些方法,比如在用户帐户上设置标志,表示它已被禁用。这会将其从登录屏幕中完全删除。从我发现的是,如果用户帐户登录,它不会应用ADS_禁用标志。我还尝试寻找注销另一个帐户的资源,但我似乎只能找到注销运行注销命令的帐户的信息。例如,或直接调用程序


我在上找到了一个资源,发现可能有什么东西。我正在为学校做这个项目,我需要一些指导。既然做这件事的信息如此稀少,有没有更好的方法来做我想做的事情?或者我不应该这么做有什么原因吗?有其他选择吗?

使用
WTSDisconnectSession()
Windows API。见文章

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

  [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\u Force
标志,如下所示:

ExitWindowsEx(0 | 0x00000004, 0);
ExitWindowsEx(0 | 0x00000004, 0);

有关此函数的更多详细信息:

根据Leng Weh Seng的答案(因为我无法发表评论),如果您想强制用户注销,则需要添加EWX_Force标志,如下所示:

ExitWindowsEx(0 | 0x00000004, 0);
ExitWindowsEx(0 | 0x00000004, 0);

有关此函数的更多详细信息:

必须是一个api,您可以将其绑定到某个地方,这样您就不必重新发明轮子。我正在尝试为Windows XP执行此操作,据我所知,家庭中心不支持XP。您可能想签出。这是假设你不介意非C#解决方案。似乎是基于powershell的,这是执行此性质任务的实际方式。Windows自Windows 2000起就支持基于时间的用户锁定。看看Windows XP Home Edition支持的组策略。我发现这可能会有帮助。这太棒了,你知道如何获取用户会话id吗?我可以从WMI获取它吗?您可以使用
[DllImport(“Kernel32.dll”,SetLastError=true)]静态外部UInt32 WTSGetActiveConsoleSessionId()正如我从@esmehsnj中读到的:或者
wtsenumeratessions()
我不知道。UWP支持WinAPI吗?也许不是。@johnalexiu显然不是,根据这个答案,我们可以在WinRT中找到等价的函数,这等价于
ExitWindowsEx(4,0)如何注销其他已登录的用户?