Изменить ключ реестра другого пользователя - PullRequest
13 голосов
/ 03 июля 2011

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

Ответы [ 2 ]

11 голосов
/ 03 июля 2011

Вы можете выдать себя за пользователя, а затем изменить реестр для этого текущего контекста. Вот несколько ресурсов по 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);.

5 голосов
/ 03 июля 2011

У вас есть два варианта.Вы можете выдать себя за этого пользователя, если у вас есть его учетные данные, как лучше демонстрирует Филипп Экберг;или

HKCU - это просто символическая ссылка для одной из клавиш в HKEY_USERS.Если вы знаете SID этого пользователя, вы можете найти его там.Вы можете получить идентификатор безопасности следующим образом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...