Winlogon通知DLL - 以登录用户身份创建进程

时间:2011-02-10 19:34:59

标签: c++ dll notify winlogon

我需要在用户解锁计算机时运行应用程序。这在Win 7中与常规任务调度程序一起游戏。对于XP - ive创建了一个C ++ DLL来执行此操作。这似乎很有效,除了它在系统帐户下这样做(因此不会显示在用户的桌面上)。

我有2个函数,第一个WLEventLogon在系统acct下启动进程,

第二,(我在15年内没有完成C ++,所以我生气了!)很可能是非常不正确的。我试图在他解锁系统时让一个简单的应用程序在用户的帐户上运行。

下面是我的代码 - dll正常工作,我用rundll32测试了这些方法,并在winlogon / notify中使用它们

    // Here is the event handler for the Winlogon Logon event.
//__declspec( dllexport ) void WLEventLogon (PWLX_NOTIFICATION_INFO pInfo);

WINLOGINDLL_API void WLEventLogon (PWLX_NOTIFICATION_INFO pInfo)
{   

    const wchar_t* path =  L"C:\\path\\app.exe";


    ShellExecute(GetDesktopWindow(),L"open",path,NULL,NULL,SW_SHOWNORMAL);      
}


WINLOGINDLL_API void Test (PWLX_NOTIFICATION_INFO pInfo)
{   


STARTUPINFOW        lpStartupInfo;
PROCESS_INFORMATION lpProcessInfo;

ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
ZeroMemory(&lpProcessInfo, sizeof(lpProcessInfo));
lpStartupInfo.cb = sizeof(lpStartupInfo);
lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow = SW_SHOW;
CreateProcessAsUser(pInfo->hToken, L"C:\\path\\app.exe",L"test",NULL,NULL,FALSE,NULL,NULL,NULL,&lpStartupInfo,&lpProcessInfo);

   }

'test'函数似乎根本不起作用 - 我的CreateProcessAsUser很可能非常错误。

2 个答案:

答案 0 :(得分:2)

您确定hToken值不是NULL吗?如果不是,请尝试使用DuplicateTokenEx()来检索用户的主要令牌,然后将其传递给CreateProcessAsUser()

WINLOGINDLL_API void Test (PWLX_NOTIFICATION_INFO pInfo)
{
    if( !pInfo->hToken )
        return;

    STARTUPINFOW        lpStartupInfo;
    PROCESS_INFORMATION lpProcessInfo;
    ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo));
    ZeroMemory(&lpProcessInfo, sizeof(lpProcessInfo));
    lpStartupInfo.cb = sizeof(lpStartupInfo);
    lpStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
    lpStartupInfo.wShowWindow = SW_SHOW;

    HANDLE hUserToken;
    if( !DuplicateTokenEx(pInfo->hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken) )
        return;

    if( CreateProcessAsUser(hUserToken, ...) )
    {
        ...
    }

    CloseHandle(hUserToken);
}

答案 1 :(得分:1)

您可以在通知dll的注册中将Impersonate值设置为1。 (见documentation)。它会模仿用户。

我个人总是倾向于将"WinSta0\\Default"明确设置为lpDesktop的{​​{1}}字段,并使用STARTUPINFOW API代替CreateProcess

此外,函数ShellExecute的名称有点奇怪,而不是WLEventLogon。您是否在注册表中将函数名称注册为WLEventLogon值?