Windows 10 个分配的访问权限:如何以编程方式注销

Windows 10 assigned access: how to logout programmatically

我在分配的访问权限(Windows 10 的 Kiosk 模式)下后台有控制台应用程序 运行。通过来自主 UWP-app 的命令,它应该注销当前用户。我已经尝试了两种方法来做到这一点:

如果当前用户有密码,两者都可以正常工作。但如果用户没有密码,注销后Windows会立即重新登录。有没有办法避免重新登录?

更新: 看起来 LockWorkStation 也不起作用。可能是出于安全原因?

试试这个

注销当前用户。

ExitWindows(0, 0);
ExitWindowsEx(EWX_LOGOFF, 0);

有用户交互

应用程序收到WM_QUERYENDSESSION消息并显示一个对话框询问是否可以结束会话。如果用户点击,系统注销用户。如果用户单击 ,注销将被取消。

case WM_QUERYENDSESSION:  
{ 
    int r; 
    r = MessageBox(NULL,(LPCWSTR)L"End the session?",(LPCWSTR)L"WM_QUERYENDSESSION",MB_YESNO);

    // Return TRUE to continue, FALSE to stop. 

    return r == IDYES; 
    break; 
}

根据 Raymond Chen from Microsoft 这是不可能的:

UWP applications cannot sign users out or lock the workstation. That would result in a denial of service from an app that just locked the workstation in a tight loop.

在您的 Client/Server 中,UWP 应用程序向桌面应用程序发送请求,方法尝试 WTSDisconnectSession() call in the desktop application, as suggested here

非常感谢@magicandre1981 在评论中的解答。他的回答:

try this call instead of ExitWindows

这对我有用。

我实际上是在 msdn

上找到的

它解释了如何退出分配的访问权限。 从当前视图获取 LockApplicationHost。如果 host 为 null,则该应用程序不会 运行 在分配的访问权限下,因此它已正常启动。然后调用 RequestUnlock() 并显示登录屏幕,您可以使用不同的用户登录。

Windows.ApplicationModel.LockScreen.LockApplicationHost lockHost = Windows.ApplicationModel.LockScreen.LockApplicationHost.GetForCurrentView();

if (lockHost != null)
{
    lockHost.RequestUnlock();
}