首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Winlogon通知DLL --以登录用户的身份创建进程

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

Stack Overflow用户
提问于 2011-02-11 03:34:59
回答 2查看 2.8K关注 0票数 0

我需要在用户解锁计算机时运行应用程序。这在Win 7和常规的任务调度程序中工作得很顺利。对于XP -- ive创建了一个C++ DLL来做这件事。这似乎工作得很好,除了它是在系统帐户下工作的(因此不会显示在用户的桌面上)。

我有两个函数,第一个WLEventLogon在系统帐户下启动进程,

第二,(我已经有15年没有做过C++了,所以我有点生疏了!)很可能是极不正确的。我正在尝试让一个简单的应用程序在用户的账户上运行,每当他解锁系统时。

下面是我的代码--动态链接库可以工作,我已经用rundll32测试了这些方法,并在winlogon/notify中使用了它们

代码语言:javascript
复制
    // 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很可能是大错特错了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-11 05:57:01

您是否确保hToken值不为空?如果不是,请尝试使用DuplicateTokenEx()检索用户的主令牌,然后将其传递给CreateProcessAsUser()

代码语言:javascript
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2011-02-11 07:06:23

在注册通知Impersonate时,您可以只使用设置为1的DLL值。(参见documentation)。它将模拟用户。

我个人总是更喜欢显式地将"WinSta0\\Default"设置为STARTUPINFOWlpDesktop字段,并使用CreateProcess接口而不是ShellExecute

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4961740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档