Winlogon Notification DLL - создает процесс как пользователь, вошедший в систему - PullRequest
0 голосов
/ 10 февраля 2011

Требуется запустить приложение, поскольку пользователь разблокирует свой компьютер. Это работает плавно в Win 7 с обычным планировщиком задач. Для XP - я создал C ++ DLL для этого. Кажется, это работает отлично, за исключением того, что это происходит под системной учетной записью (и, следовательно, не отображается на рабочем столе пользователя).

У меня есть 2 функции, первый WLEventLogon запускает процесс по действию системы,

2-й, (я не делал C ++ примерно 15 лет, так что я немного ржавый!), Скорее всего, совершенно неверно. Я пытаюсь заставить простое приложение работать под учетной записью пользователя всякий раз, когда он разблокирует систему.

Ниже мой код - 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 ]

2 голосов
/ 11 февраля 2011

Вы убедились, что значение 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 голос
/ 11 февраля 2011

Вы можете просто использовать Impersonate значение, установленное на 1, при регистрации уведомления dll.(см. документация ).Это будет выдавать себя за пользователя.

Лично я всегда предпочитаю явно указать "WinSta0\\Default" как lpDesktop поле STARTUPINFOW и использовать CreateProcess API вместо ShellExecute.

Более того, немного странно, что название функции WLEventLogon, а не что-то вроде WLEventLogon.Вы регистрируете имя функции как значение Unlock в реестре?

...