以编程方式从Windows服务锁定工作站

时间:2016-07-26 17:05:33

标签: c# visual-studio-2015 windows-services

在我的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)
}

但上面的代码无效。

有人有解决方案吗?

3 个答案:

答案 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