在我的Windows服务中,我尝试使用以下代码锁定工作站:
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool LockWorkStation();
if (!LockWorkStation()){
//Workstation was unable to lock(Write this on event log)
}
但上面的代码无效。
有人有解决方案吗?
答案 0 :(得分:3)
您无法在Windows服务中执行此操作,在documentation中明确指出,只能从交互式桌面中运行的进程调用此API函数。 Windows服务未在交互式桌面中运行。
如果必须这样做,首先应检查用户是否已登录,然后在您要锁定的inpersonating用户下生成进程。但在我看来,这似乎是一种非常强硬的解决方案。也许更好的解决方案是在用户登录时启动隐藏或托盘应用程序,然后从该应用程序完成工作。
答案 1 :(得分:1)
Windows服务无法在桌面上运行,因此您无法从服务中调用它。
从LockWorkStation文档中,强调我的:
LockWorkStation功能仅可由交互式桌面上运行的进程调用。此外,用户必须登录,并且工作站尚未锁定。
这可能是一个黑客,但也许你可以创建一个托盘应用程序,响应来自服务的某种进程间调用,可以调用LockWorkStation
。
如果您不喜欢托盘应用程序的可见特性,请考虑创建一个控制台应用程序,该应用程序生成一个线程以等待呼叫,并在用户登录时无窗口运行。
另一种可能性是创建一个永远不会创建UI窗口的Windows应用程序。如果您使用data copy API,这绝对是您想要做的。
这里的关键是某些东西必须在用户的交互式环境中运行。
供参考,您可以查看Microsoft's MSDN topic on IPC。
答案 2 :(得分:1)
您可以使用WTSDisconnectSession Windows API执行此操作,它将以与LockWorkStation相同的方式注销用户。
但是,由于该服务处于特殊会话中,因此您无法断开WTS_CURRENT_SESSION并且必须断开计算机上的每个活动会话。
add