0

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

我有2个函数,第一个WLEventLogon启动系统账户下的进程,

第二个,(我已经有 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);

   }

“测试”功能似乎根本不起作用——我的 CreateProcessAsUser 很可能是大错特错。

4

2 回答 2

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);
}
于 2011-02-10T21:57:00.520 回答
1

您可以Impersonate在通知 dll 的注册中使用设置为 1 的值。(见文档)。它将冒充用户。

我个人总是更喜欢显式设置"WinSta0\\Default"为的lpDesktop字段STARTUPINFOW并使用CreateProcessAPI 而不是ShellExecute.

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

于 2011-02-10T23:06:23.337 回答