Вы можете выдать себя за пользователя, а затем изменить реестр для этого текущего контекста. Вот несколько ресурсов по C # и олицетворению:
То, что вы хотите сделать, это что-то вроде этого (псевдо):
using(var impersonation = new Impersonate(username,password))
{
ChangeRegistry(keys, values);
}
И когда олицетворение удаляется, вы снова используете работающего пользователя. Вот пример реализации класса Impersonate, который реализует IDisposable, чтобы действовать как псевдоэксперимент, показанный выше, а - это еще один пример .
Вот пример о том, как вы изменяете значения реестра:
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
необходимо также загрузить профиль пользователя. Это делается путем вызова другого метода Win32, который называется LoadUserProfile
. Здесь есть полный пример , который вы можете использовать, но я собираюсь включить здесь важные биты.
Сначала вам нужно включить методы 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);
.