Как изменить или изменить значения реестра другого пользователя, чем текущий пользователь? Я знаю учетные данные этого другого пользователя.
Изменить раздел реестра другого пользователя
Ответ 1
Вы можете олицетворять пользователя, а затем изменять реестр для этого текущего контекста. Вот несколько ресурсов на С# и олицетворении:
Что вы хотите сделать, это что-то вроде этого (псевдо):
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);
.
Ответ 2
У вас есть два варианта. Вы можете олицетворять этого пользователя, если у вас есть свои полномочия, как показывает Филипп Экберг; или
HKCU - это просто символическая ссылка для одного из ключей под HKEY_USERS
. Если вы знаете SID этого пользователя, вы можете найти его там. Вы можете получить SID так:
var account = new NTAccount("userName");
var identifier = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
var sid = identifier.Value;
Лучший вариант - олицетворять. Второй вариант может работать лучше, если вы не знаете эти учетные данные пользователя. Недостатком является то, что вам понадобятся права администратора для записи в чужой учетной записи.