Win32 API在我的DLL中調用,它將由SYSTEM用戶加載,並且該API根據當前用戶返回不同的結果,因此我無法獲得對應於當前用戶,當DLL在SYSTEM上下文中運行時,如何在當前登錄用戶上下文中調用該API?如何調用冒充另一個用戶而非SYSTEM的函數
回答
我做了一些研究,並得出結論:這(我不是一個Win32 API的專家,但我在它真正感興趣):
您可以使用ImpersonateLoggedOnUser
,它要求一個primary或impersonation令牌句柄(兩者中至少有TOKEN_QUERY
,主令牌上的TOKEN_DUPLICATE
或模仿令牌上的TOKEN_IMPERSONATE
)。
如果您擁有當前登錄的用戶令牌和正確的權限,您只需使用ImpersonateLoggedOnUser
,就可以調用所需的API函數,然後致電RevertToSelf
返回其原始所有者令牌。
但是,獲取當前登錄的用戶令牌並不那麼容易。您必須使用LogonUser
指定用戶的名稱和密碼(看起來不正確),或者擁有足夠的權限讓您撥打WTSQueryUserToken
,這可能與您正在開發的項目類型不同。或者,如果您真的願意以普通流程完成這項工作,您還可以探索Authentication Functions,您可以在這裏利用新的Windows UAC和安全上下文,這些工作可能有點複雜。
也有這種方法,我不知道它是否有效:Impersonate standard user(通過使用OpenProcessToken
獲取令牌explorer.exe
)。
一些鏈接,我發現有用:
- MSDN - Client Impersonation (Windows)
- MSDN - Access Tokens (Windows)
- MSDN - LsaLogonUser function (Windows)
- A Simple Impersonation Program Example
- CodeProject - User Impersonation
- CodeProject - Vista UAC: The Definitive Guide
我建議:在繼續之前,確保在調用所提到的API函數時確實需要模擬用戶。看看是否有另一條路徑來實現你想要的。
您還可以指定您嘗試使用哪個API函數,這可能會將您重定向到另一個更簡單的問題。
非常感謝! –
- 1. 調用的函數,而另一個函數調用的結果
- 2. 錯誤而調用另一個函數
- 3. 當我已經冒充另一個用戶時模擬一個用戶?
- 4. 如何調用的函數,而在另一個程序MATLAB
- 5. 如何調用另一個函數內的一個函數Jquery
- 6. 如何調用另一個JavaScript函數
- 7. 如何調用另一個函數
- 8. 調用成員函數的bind_param()函數調用另一個函數調用的非對象內部函數
- 9. 試圖冒充另一個用戶來更新Active Directory
- 10. 如何通過冒充OData的用戶
- 11. 調用另一個函數
- 12. .filter()如何使回調函數調用另一個函數?
- 13. 如何在另一個函數中調用另一個類的函數
- 14. 如何使用一個函數的參數來調用另一個函數
- 15. 從另一個函數調用另一個函數在這個
- 16. 函數不調用另一個函數
- 17. 從另一個函數調用函數
- 18. 調用函數到另一個函數
- 19. 函數調用另一個函數javascript
- 20. 從另一個函數調用函數
- 21. 如何從另一個函數調用這個void函數?
- 22. 如何在另一個函數中調用多個函數C
- 23. 如何記錄的函數調用另一個函數
- 24. 如何在Python的另一個函數中調用函數?
- 25. 如何從另一個函數調用Jquery中的函數
- 26. 如何檢查被另一個函數調用的函數?
- 27. 如何從PostgreSQL中的另一個函數調用表函數?
- 28. 如何從React-Native的另一個函數調用函數?
- 29. 如何從另一個函數內調用函數的方法
- 30. 如何調用另一個函數的返回內部函數?
DLL是否在Windows服務中?用普通的程序冒充通常非常困難。您需要用戶名和密碼才能獲取當前用戶的令牌... –
是的,事實證明,設計不合適,如果我們想在用戶上下文中調用API,我們應該使其成爲用戶服務。 –