2015-10-19 49 views
0

有一個Windows應用程序需要管理員權限,並在其清單中聲明。當受限用戶啓動時,她必須輸入管理員憑證。沒關係,應用程序運行良好,但無法獲得原始用戶文件夾(ShellAPI返回管理員的文件夾)。當應用程序需要管理員權限並在管理員帳戶下啓動時,獲取受限用戶文件夾

由於應用程序最初是在管理員下啓動的,因此我可以存儲原始用戶的文件夾路徑以便以後使用它們。

有沒有辦法獲得初始限制用戶憑證?

問候,

+1

這就是系統的工作原理。該進程在不同的用戶帳戶下運行。標準用戶不打算運行管理任務。一般來說,處理這個問題的正確方法是,所涉及的應用程序始終停止要求管理員權限,並且只請求他們處理需要它們的操作子集。 –

回答

2

因爲你的表現,你的應用程序正在運行作爲管理員用戶,而不是當前登錄的受限用戶。正如David Heffernan所提​​到的,您應該重新設計您的應用程序,不要求整個應用程序運行得更高。將您的管理任務委派給一個單獨的進程,並在需要時運行。這就是說,如果你必須運行你的整個應用程序提升,所有不會丟失,但你將不得不做一些額外的工作。

  1. 開始通過讓你提升應用程序運行於其中的會話ID,你可以做,使用WTSQuerySessionInformation()WTS_CURRENT_SESSION,或ProcessIdToSessionId()GetCurrentProcessId(),或OpenProcessToken()打開當前進程的令牌,然後使用GetTokenInformation()

  2. 一旦你的會話ID,使用EnumProcesses()GetProcessImageFileName()(或同等學歷),OpenProcessToken()GetTokenInformation()找到explorer.exe實例(或任何PC的註冊外殼程序是,你可以在註冊表中找到),其運行在與您的應用相同的會話ID中。

  3. 找到後,您將擁有該進程的用戶令牌OpenProcessToken()。使用DuplicateTokenEx()複製它以獲取其主令牌,然後根據需要將該令牌與LoadUserProfile(),SHGetFolderPath()SHGetKnownFolderPath()等API一起使用。

+0

有用的可能是爲了查找登錄用戶的會話,但不是爲了獲取對查詢大多數用戶相關數據(例如shell文件夾路徑)所必需的登錄用戶令牌的訪問權限。只有SID不足以獲得令牌。 –

相關問題