2011-07-03 25 views

回答

11

您可以模擬用戶,然後更改當前上下文的註冊表。這裏是C#和模擬一對夫婦的資源:

你想要做的是這樣的(僞):

using(var impersonation = new Impersonate(username,password)) 
{ 
    ChangeRegistry(keys, values); 
} 

當模擬處置,你又回到了正在使用的用戶。 Here is an example implementation Impersonate類,實現IDisposable行爲像上面顯示的僞檢驗和here is another example

Here is an example您如何更改註冊表值:

var registry = Registry.CurrentUser; 
var key = 
registry.OpenSubKey(
    @"HKEY_CURRENT_USER\Some\Path\That\You\Want\ToChange", true); 

key.SetValue(null, "");    
Registry.CurrentUser.Flush(); 

更新

所以你需要以訪問HKCU做的是,你還必須加載用戶配置文件。這是通過調用另一個稱爲LoadUserProfile的Win32方法完成的。有一個complete example here,你可以使用,但我會在這裏包括重要的位。

首先,你需要包括Win32的方法是這樣的:使用塊

[DllImport("userenv.dll", SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool LoadUserProfile(IntPtr hToken, 
             ref ProfileInfo lpProfileInfo); 

[DllImport("userenv.dll", CallingConvention = CallingConvention.Winapi, 
          SetLastError = true, CharSet = CharSet.Auto)] 
public static extern bool UnloadUserProfile(IntPtr hToken, 
                IntPtr lpProfileInfo); 

內,您的模擬,你需要做到以下幾點:

ProfileInfo profileInfo = new ProfileInfo(); 
profileInfo.dwSize = Marshal.SizeOf(profileInfo); 
profileInfo.lpUserName = userName; 
profileInfo.dwFlags = 1; 
Boolean loadSuccess = LoadUserProfile(tokenDuplicate, ref profileInfo); 

並在此之後,你應該能夠訪問HKCU。完成後,您需要使用UnloadUserProfile(tokenDuplicate, profileInfo.hProfile);卸載配置文件。

+0

非常感謝,但它沒有奏效,它改變了當前用戶的註冊表而不是模擬用戶! –

+0

你確定模擬已經解決嗎?您可以嘗試打印出當前的用戶身份並查看其真實身份。此外,這是和ASP.NET應用程序還是Windows應用程序?如果它是一個Web應用程序,則需要允許模擬。 –

+0

不,這是一個WPF應用程序。使用(ImpersonatedUser im = new ImpersonatedUser(「aaa」,Environment.MachineName,「1」)) { Registry.CurrentUser。CreateSubKey( 「TMP10」); Registry.CurrentUser.Flush(); } 它創建了當前用戶的密鑰,但沒有在'aaa':( –

3

你有兩種選擇。您可以模仿該用戶,如果您擁有他們的憑據,Filip Ekberg會更好地證明這一點;或

HKCU只是HKEY_USERS下的其中一個鍵的符號鏈接。如果你知道該用戶的SID,那麼你可以在那裏找到它。你可以這樣得到SID:

var account = new NTAccount("userName"); 
var identifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier)); 
var sid = identifier.Value; 

更好的選擇是模擬。當你不知道用戶的憑證時,第二種選擇可能會更好。缺點是您需要管理權限才能寫入其他人的帳戶。

+0

模擬不起作用,但sid很有用,但我與未經授權的訪問異常發生衝突,雖然UAC已關閉,而且我是管理員! –

+0

@MSS,請嘗試請求提升權限。 –

+0

它的工作,我的錯誤是,我已經打開閱讀的關鍵!錯誤: var key = Registry.Users.OpenSubKey(sid);正確的是:var key = Registry.Users.OpenSubKey(sid。true); !!! –