我目前正在研究一些家长控制软件。该软件应该注销用户,然后锁定帐户,以便他们无法重新登录,除非父/管理员已指定他们可以。
到目前为止,我已尝试了几项操作,例如在用户帐户上设置标记,表示已禁用。这会将其从登录屏幕中完全删除。根据我的发现,如果用户帐户已登录,则不会应用ADS_Disable标志。我也尝试寻找登出其他帐户的资源,但我似乎只能找到有关注销正在运行logout命令的帐户的信息。例如Pinvoke,或直接调用LOGOUT.EXE程序。
我在LSAUser找到了一个资源,发现可能存在某些内容。我正在为学校做这个项目,我需要一点指导。由于关于这样做的信息量非常稀少,有没有更好的方法来做我想做的事情?或者我有理由不这样做吗?任何替代方案?
答案 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)
ExitWindowsEx(0 | 0x00000004, 0);
有关此功能的更多详细信息:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376868(v=vs.85).aspx