2009-09-15 7 views
1

Я пытаюсь Олицетворение учетной записи администратора от службы LocalSystem для того, чтобы получить данные из администраторов HKEY ТОКА реестра USER - для того, чтобы выдавать себя я использую код Codeproject найти на следующем сайте написанного Уве Кейм: ImpersonatorОлицетворение для получения пользователя HKEY_CURRENT_USER не работает?

Мой исходный код следующим образом:

using (new Impersonator("user", ".", "pass")) 
{ 
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("Software\\CompanyName"); 
    string sValue = rk.GetValue("Value", "").ToString(); 
    rk2.Close(); 
} 

мое ожидание, что SValue бы от пользователя/пасс счета (как я олицетворения его), но как ни странно это все еще SValue со счета LocalSystem, где моя служба находится в эксплуатации ...

Любые подсказки о том, что я делаю неправильно? Любая помощь приветствуется. Спасибо,

+0

Обновленный ответ ниже. –

ответ

1

Я предполагаю, что вы обнаружите, что вам не повезло. Это невозможно.

Если приложения смогли олицетворять учетную запись администратора и записывать значения в реестр в Windows, это может стать огромной дырой в безопасности. Я предполагаю, что свойство Registry.CurrentUser будет ВСЕГДА ссылаться на пользователя, запускающего ваше приложение ... независимо от того, пытаетесь ли вы имитировать себя или нет.

EDIT

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

Указывает ли ваш код на статический класс Registry перед запуском вашего кода олицетворения? Если это так, это будет проблемой. Если вы посмотрите на свойство Registry.CurrentUser в Reflector, вы увидите, что он установлен статическим конструктором объекта Registry. Статические конструкторы вызываются, когда статический объект сначала ссылается.

В вашем случае, если вы ссылка на Registry объекте (идет ли речь CurrentUser или нет) статический конструктор вызываются ставящая CurrentUser к исходному пользователю ... не счет олицетворения.

+0

Я думаю, вы можете ошибаться. Код олицетворения фактически входит в систему как предоставленный пользователь и для этого требуются полные учетные данные. Здесь нет дыры в безопасности, потому что вы регистрируетесь с использованием кода вместо приглашения на вход. – JohnFx

+0

The Impersonator - это служба LocalSystem, которая имеет такое же право, как и администратор ... Но если это нормально, то почему это не работает (какие-то подсказки?) – Shaitan00

+0

Является ли класс имперсонара компилированным в отдельную сборку? Если да, попытались ли вы потянуть его в тот же модуль, что и ваш тестовый код, чтобы убедиться, что он ведет себя по-другому? – JohnFx

3

Все, что я прочитал по этому вопросу, похоже, указывает на то, что олицетворение должно получить доступ к HKEY_CurrentUser для олицетворенной учетной записи. Однако это может быть причудой в реализации .NET Registry.

Это просто догадка и непроверенная в этом, но вы считали, что используете Registry.Users вместо Registry.CurrentUser?

Вам необходимо find the SID для учетной записи администратора, но вы должны быть в состоянии сделать вывод, что с помощью Regedit

+0

Не вариант - это тест, чтобы убедиться, что если я использую RegEdit для слияния REG-файла, который отправляется на HKEY_CURRENT_USER, он обновляет реестр учетных записей администратора, а не учетную запись LocalSystem. – Shaitan00

+0

Итак, почему именно это исключает это как возможность? HKEY_CURRENT_USER по существу является лишь ссылкой на подраздел HKEY_USERS для зарегистрированного пользователя. – JohnFx

+0

Предположим, у меня есть файл file.REG, который меняет некоторые значения в «HKEY_CURRENT_USER \ Something \ Value = Data». Если я делаю regedit file.REG, мне нужно, чтобы это повлияло на учетные записи администратора HKCU, а не на LocalSystem (Service). Поиск Registry.Users и SID не поможет ... Посмотрите, что я имею в виду? – Shaitan00

0

По умолчанию ручки HKEY_CURRENT_USER кэшируются на процессе широкой основе. Поэтому, когда вы олицетворяете пользователя, а затем получаете доступ к текущему пользовательскому улью, вы будете получать доступ к улей пользователя, который запустил процесс, а не выдает себя за пользователя. Это справедливо для всех процессов Win32 не только .Net. Если вы хотите отключить это кэширование, чтобы все текущие пользовательские вызовы переходили в правильный пользовательский куст под HKEY_USERS, вы должны вызвать RegDisablePredefinedCache через pInvoke.

Будьте предупреждены, что если пользователь, которому выдали себя за образец, не загрузил свой профиль, то любые запросы CurrentUser будут перенаправлены пользователю .DEFAULT. Поэтому вам также может потребоваться вызвать LoadUserProfile.

Отключение кэширования ручек также приведет к небольшому замедлению во всех запросах CurrentUser.

1

Я знаю, что это старый поток, но недавно я столкнулся с одной и той же проблемой (хотя и с помощью службы Windows C++), и подумал, что поделился своими выводами, потому что многие форумы задавали один и тот же вопрос, и ни один из них не оставил удовлетворительного ответ.

В принципе, я нашел два способа приблизиться к этому, хотя это больше подходит для приложений C, чем .NET (я не тестировал с помощью pinvoke, но он может работать).

Решение 1: Вместо использования RegOpenKey используйте RegOpenCurrentUser(), чтобы получить ключ. По-видимому, причина, по которой RegOpenKey не получает ключ выданного пользователя, заключается в том, что HKEY_CURRENT_USER - , кэшированный в текущей нити.

Решение 2: RegDisablePredefinedCache(). Этот отключает кеш, упомянутый выше, и позволяет последующим вызовам HKEY_CURRENT_USER быть фактическим олицетворением пользователя. Это решение, с которым я пошел.

Надеюсь, это поможет.