Подтвердить что ты не робот

Изменить раздел реестра другого пользователя

Как изменить или изменить значения реестра другого пользователя, чем текущий пользователь? Я знаю учетные данные этого другого пользователя.

4b9b3361

Ответ 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;

Лучший вариант - олицетворять. Второй вариант может работать лучше, если вы не знаете эти учетные данные пользователя. Недостатком является то, что вам понадобятся права администратора для записи в чужой учетной записи.