如何监控Windows Server 2003/2008用户登录?

0 c++ winapi monitoring windows-server-2003 windows-server-2008

我想写一个程序,如果有人登录我的服务器,它应该自动执行一些任务.

我对此的疑问是:

  • 1)是否有用户登录后立即设置的最后一次登录记录我可以使用/监控我的目的?如果没有,我可以使用类似的东西吗?

  • 2)持续监控这样一个价值的最佳方法是什么?

Ori*_*rov 6

您最好的(也是最安全的)赌注是创建一个接受SERVICE_CONTROL_SESSIONCHANGE控件的服务.

这将允许您的服务控制处理程序在用户登录,注销,锁定会话以及各种其他选项时接收控件.在链接打击中查找更多信息.

这是通过创建一个在dwControlsAccepted中具有SERVICE_ACCEPT_SESSIONCHANGE标志的服务来完成的,如下所示:

SERVICE_STATUS ss;
...
ss.dwControlsAccepted |= SERVICE_ACCEPT_SESSIONCHANGE;
Run Code Online (Sandbox Code Playgroud)

其次是:

// This lets the service accept the session change ctrls
// The service handle here is received by calling RegisterServiceCtrlHandler
SetServiceStatus(hServiceHandle,
                 &ss);
Run Code Online (Sandbox Code Playgroud)

这将允许Windows将SERVICE_CONTROL_SESSIONCHANGE控件发送到您的HandlerEx函数,该函数应如下所示:

DWORD WINAPI HandlerEx(DWORD dwControl,
                       DWORD dwEventType, 
                       LPVOID lpEventData, 
                       LPVOID lpContext)
{
   switch (dwControl)
   {
    ...// Regular control handling
       case (SERVICE_CONTROL_SESSIONCHANGE):
            switch(dwEventType)
            {
                case(WTS_SESSION_LOGON):
                    // Handle logon
                break;

                case(WTS_SESSION_LOCK):
                    // Handle lock
                break;
                ...
            }
       break;

       ...
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以阅读可以从此处收到的所有不同会话更改通知:WM_WTSSESSION_CHANGE,您需要的所有通知都在说明的wParam部分.

好吧,无论如何,这是它的要点.您可以在此处阅读有关handlerex功能的更多信息:HandlerEx以及有关服务的更多信息:服务功能.我建议您阅读ServiceMain函数,RegisterServiceCtrlHandler函数,最重要的是,阅读MSDN页面上发布的示例.他们非常有帮助.

祝好运!