2011-07-03 16 views

答えて

11

ユーザーを偽装して、その現在のコンテキストのレジストリを変更することができます。ここではC#と偽装上のリソースのカップルです:

何がやりたいことは、このような何か(擬似)である:

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

そして、偽装が取り消された場合は、実行中のユーザーを再び使用して戻ります。 Here is an example implementationは、前述の疑似実例のように動作する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

偽装が成立したことは確かですか?あなたは現在のユーザーIDを試して印刷し、本当に誰であるかを見ることができます。また、このASP.NETアプリケーションまたはWindowsアプリケーションもありますか? Webアプリケーションの場合は、偽装を許可する必要があります。 –

+0

いいえ、WPFアプリです。 using(ImpersonatedUser = new ImpersonatedUser( "aaa"、Environment.MachineName、 "1")) { Registry.CurrentUser。CreateSubKey( "TMP10"); Registry.CurrentUser.Flush(); } これは現在のユーザーにキーを作成しましたが、 'aaa'にはありません:( –

3

2つのオプションがあります。 Filip Ekbergの方が優れていることが証明されている場合は、そのユーザーを偽装することができます。または

HKCUは、HKEY_USERSのキーのいずれかのシンボリックリンクに過ぎません。そのユーザーのSIDを知っていれば、そのユーザーのSIDを見つけることができます。

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

より良いオプションは、偽装することです。 2番目のオプションは、ユーザーの資格情報がわからない場合にはより効果的です。欠点は、他人のアカウントに書き込むために管理者権限が必要になることです。

+0

偽装は機能しませんでしたが、sidは便利ですが、UACがオフで、私は管理者ですが、権限のないアクセス例外が発生しました。 –

+0

@MSS、アクセス権の昇格を試みてください。 –

+0

それは働いた、私の間違いは私が読書の鍵を開いたことだった!間違い: var key = Registry.Users.OpenSubKey(sid);権利は:var key = Registry.Users.OpenSubKey(sid。true); !!! –

関連する問題