我遇到了當前正在處理的Windows服務的問題。基本上我在HKCU註冊表中存儲了一些值(從一個以管理員身份運行的GUI工具),並從該GUI中啓動一項服務。該服務使用SYSTEM帳戶運行,我相信這是我的問題 - 我無法訪問存儲在我的GUI工具內的註冊表項,因爲它指向不同的HKCU!C#訪問另一個用戶的註冊表
如何「重定向」該服務以使用存儲的用戶的HKCU? (其實我可以傳遞用戶名到服務或SID,如果有人會指出我如何在我的GUI中檢索它,但我不知道我應該用什麼來「改變」用戶指向正確的)
@EDIT
我使用靜態類訪問註冊表,它用於通過GUI和服務和功能來檢索基本密鑰是(rootKey是字符串變量保持子項名稱):
private static RegistryKey GetBaseKey(bool writable = false)
{
try
{
RegistryKey reg = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
RegistryKey rk = reg?.OpenSubKey("SOFTWARE", writable)?.OpenSubKey(rootKey, writable);
return rk;
}
catch (Exception ex)
{
// handle exceptions later
}
return null;
}
我發現WindowsIdentity類可以爲當前用戶提供句柄(AccessToken),我應該將它作爲參數傳遞給我的服務並使用此句柄在服務內冒充?
@ EDIT2
我已經做了一些東西,但它不起作用。我的嘗試:
CurrentUserToken = WindowsIdentity.GetCurrent().Token; // to get current identity token
然後ServiceController.Start
我說CurrentUserToken.ToString()
作爲參數。在我的服務,我初始化RegistryUserToken (IntPtr)
與傳遞的價值,我被困在:
WindowsIdentity RegUser = new WindowsIdentity(RegistryUserToken)
拋出異常
無效令牌模擬 - 它不能重複
我試過與WindowsIdentity的當前實例的AccessToken相同 - 拋出相同的異常
我可以一直這樣嗎?或者我應該嘗試一些不同的?
顯示您的代碼。你如何使用註冊表? –
添加了「主要」註冊表方法,所有其他方法都使用它來獲取要使用的子項。 – user1970395
您可以簡單地在您的用戶帳戶下運行Windows服務。 –