2017-03-16 123 views
0

我試圖啓動一個程序,作爲另一個用戶在Windows 7系統上使用Win32函數CreateProcessWithLogon啓動另一個程序,但它返回錯誤120,代表函數不支持CreateProcessWithLogon返回函數不支持

如果我在命令中運行該程序,它可以正常工作。如果我另一方面用ShellExecute啓動程序,那麼我得到錯誤。

命令行 - >啓動程序A - >程序A執行CreateProcessWithLogon。 OK 32位程序 - >啓動程序A - >程序A執行CreateProcessWithLogn。 ERROR

 if (!CreateProcessWithLogonW(L"username", L"domain", L"password", 
     LOGON_NETCREDENTIALS_ONLY, L"C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe", L"iexplore", 
     NULL, NULL, NULL, 
     &si, &pi)) 
     DisplayError(L"CreateProcessWithLogonW"); 

回答

1

如果你想啓動程序爲其他用戶沒有使用LOGON_NETCREDENTIALS_ONLY標誌 - 使用LOGON_WITH_PROFILE來代替。

STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi; 
    if (CreateProcessWithLogonW(L"username", L"domain", L"password", LOGON_WITH_PROFILE, 
     L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi)) 
    { 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 

如果你使用標誌LOGON_NETCREDENTIALS_ONLY

系統不驗證指定的憑據。

所以你真的不需要提供真實姓名或密碼。因爲系統沒有做真正的登錄,但

新工藝採用同樣的來電,但系統 LSA中創建一個新的登錄會話

因此這種登錄類型克隆主叫當前令牌,但在其中指定新的登錄會話。你的程序將運行爲相同的用戶SID,組,特權),但在不同的登錄會話

只有一層招的需要,而不是記錄 - lpUsername必須是UPN格式 - 包含@符號。

所以代碼必須是這樣的:

STARTUPINFO si = { sizeof(si) }; 
    PROCESS_INFORMATION pi; 
    if (CreateProcessWithLogonW(L"@", 0, 0, LOGON_NETCREDENTIALS_ONLY, 
     L"C:\\windows\\notepad.exe", L"notepad.exe", 0, NULL, NULL, &si, &pi)) 
    { 
     CloseHandle(pi.hThread); 
     CloseHandle(pi.hProcess); 
    } 

的結果將創建新的LogonSession與NewCredentialsSECURITY_LOGON_TYPEAuthenticationPackage == Negotiate

+0

感謝您的信息,但LOGON_WITH_PROFILE產生同樣的錯誤。 – Karlth

+0

@Karlth我當然測試了自己的代碼(om win7),它運行良好。如果完全運行你的代碼片段 - 我得到了另一個錯誤 - 「ERROR_INVALID_LOGON_TYPE」,如果刪除'LOGON_NETCREDENTIALS_ONLY'或將其與L「@」一起用作用戶名,則該錯誤消失。如果你有另一個錯誤 - 你需要調試。甚至在你的過程中可能是錯誤的,但更快的是你需要在svchost.exe -k netsvcs進程中設置bp,在seclogon.SlrCreateProcessWithLogon中進行調試並調試它,或者http://i.imgur.com/euZrIio.png或如果'LsaLogonUser'返回錯誤,則可能會調試lsass.exe – RbMm