2012-11-22 16 views
4

Win32 API在我的DLL中調用,它將由SYSTEM用戶加載,並且該API根據當前用戶返回不同的結果,因此我無法獲得對應於當前用戶,當DLL在SYSTEM上下文中運行時,如何在當前登錄用戶上下文中調用該API?如何調用冒充另一個用戶而非SYSTEM的函數

+1

DLL是否在Windows服務中?用普通的程序冒充通常非常困難。您需要用戶名和密碼才能獲取當前用戶的令牌... –

+0

是的,事實證明,設計不合適,如果我們想在用戶上下文中調用API,我們應該使其成爲用戶服務。 –

回答

4

我做了一些研究,並得出結論:這(我不是一個Win32 API的專家,但我在它真正感興趣):

您可以使用ImpersonateLoggedOnUser,它要求一個primaryimpersonation令牌句柄(兩者中至少有TOKEN_QUERY,主令牌上的TOKEN_DUPLICATE或模仿令牌上的TOKEN_IMPERSONATE)。

如果您擁有當前登錄的用戶令牌和正確的權限,您只需使用ImpersonateLoggedOnUser,就可以調用所需的API函數,然後致電RevertToSelf返回其原始所有者令牌。

但是,獲取當前登錄的用戶令牌並不那麼容易。您必須使用LogonUser指定用戶的名稱和密碼(看起來不正確),或者擁有足夠的權限讓您撥打WTSQueryUserToken,這可能與您正在開發的項目類型不同。或者,如果您真的願意以普通流程完成這項工作,您還可以探索Authentication Functions,您可以在這裏利用新的Windows UAC和安全上下文,這些工作可能有點複雜。

也有這種方法,我不知道它是否有效:Impersonate standard user(通過使用OpenProcessToken獲取令牌explorer.exe)。

一些鏈接,我發現有用:

我建議:在繼續之前,確保在調用所提到的API函數時確實需要模擬用戶。看看是否有另一條路徑來實現你想要的。

您還可以指定您嘗試使用哪個API函數,這可能會將您重定向到另一個更簡單的問題。

+0

非常感謝! –

相關問題