2011-02-10 7 views
0

ユーザーがコンピュータをロック解除するときにアプリケーションを実行する必要があります。これは、通常のタスクスケジューラでWin 7でうまく動作します。 XP-iveの場合これを行うためのC++ DLLを作成しました。これは、システムアカウントの下でそうすることを除いて、うまくいくように見えます(したがって、ユーザーのデスクトップに表示されません)。Winlogon通知DLL - ログインしたユーザーとしてプロセスを作成する

私は2つの機能を持っているが、最初のWLEventLogonは

第二は、最も可能性の高い乱暴に間違っています(私は少しさびが!イムので、15年のように、C++を行ってhaventは)、システムACCTの下でプロセスを起動します。私は彼がシステムのロックを解除するたびに、ユーザーのアカウントで実行する簡単なアプリケーションを取得しようとしています。 DLL作品とアイブ氏は、全く仕事ができること/

// 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); 

    } 

「試験」機能doesntのは思え通知します。rundll32とWinlogonプロセスでそれらを使用してメソッドをテスト - - 以下

は私のコードで私CreateProcessAsUserおそらく間違っています。

答えて

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

あなただけの通知DLLの登録には1に設定さImpersonate値を使用することができます。 (documentation参照)。それはユーザーの偽装を行います。

私は個人的には常にSTARTUPINFOWの明示的"WinSta0\\Default"lpDesktopとしてフィールドを設定し、代わりにShellExecuteCreateProcess APIを使用することを好みます。

また、WLEventLogonの名前はWLEventLogonのようなものではありません。レジストリに関数名Unlockの値を登録しますか?

関連する問題