如何检测登录屏幕或UAC是否处于活动状态

时间:2014-09-26 15:40:51

标签: windows authentication uac

我想找到一种方法来检测登录屏幕或UAC是否在我的服务流程中处于活动状态。例如:

  1. 用户需要选择帐户并输入密码才能登录的屏幕。
  2. 屏幕保护程序(锁定屏幕?)后用户需要输入密码的屏幕。
  3. 当UAC弹出时。
  4. 现在我查看会话1并检查所有进程,如果我能找到logonui.exe,我认为前两个场景中的任何一个都应该发生。但实际上,这种方法只能检测 场景1.

    登录屏幕后仍然存在

    winlogon.exe。所以我不能使用winlogon.exe作为搜索目标。

    根据this链接,我想如果我能找到当前活动(输入)桌面名称,默认,屏幕保护程序或winlogon,我就能解决我的问题。所以我跟着swatkat's回答,我的代码就像这样

    HWINSTA hs = GetProcessWindowStation();
    HWINSTA hwinsta = OpenWindowStation("winsta0", FALSE, READ_CONTROL | WRITE_DAC);
    SetProcessWindowStation(hwinsta);
    
    HDESK hd = OpenInputDesktop(0, TRUE, GENERIC_READ | DESKTOP_READOBJECTS);
    if (hd != NULL) {
        DWORD size;
        GetUserObjectInformation(hd, UOI_NAME, NULL, 0, &size);
        TCHAR* name = (TCHAR*)alloca(size + sizeof(TCHAR));
        GetUserObjectInformation(hd, UOI_NAME, name, size, &size);
        CString result(name);
        LOG((CLOG_DEBUG "input desktop name: %s %d", result.c_str(), size));
        CloseDesktop(hd);
    }
    else {
        LOG((CLOG_DEBUG "failed to call OpenInputDesktop"));
    }
    
    CloseWindowStation(hwinsta);
    SetProcessWindowStation(hs);
    

    这似乎总是回归"默认"无论它在哪个屏幕上。

    我对Windows桌面和电台并不熟悉,所以如果我做错了,请告诉我。

    提前致谢。 杰瑞

0 个答案:

没有答案