Сбой в олицетворении .Net при чтении ключей реестра (LinkLabel SecurityException) - PullRequest
4 голосов
/ 09 марта 2011

Мое приложение должно олицетворять служебную учетную запись, что я делаю с помощью нативного вызова LogonUser.Однако оказывается, что случайные компоненты в библиотеке .Net пытаются получить доступ к разделам реестра, к которым у учетной записи нет доступа, в результате чего создается SecurityException.

В частности, когда я загружаю LinkLabel, происходит сбой при попытке определить цвет гиперссылки по умолчанию в IE:

System.Security.SecurityException: Requested registry access is not allowed.
      at System.ThrowHelper.ThrowSecurityException(ExceptionResource resource)
      at Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable)
      at Microsoft.Win32.RegistryKey.OpenSubKey(String name)
      at System.Windows.Forms.LinkUtilities.GetIEColor(String name)
      at System.Windows.Forms.LinkUtilities.get_IELinkColor()
      at System.Windows.Forms.LinkLabel.get_LinkColor()
      at System.Windows.Forms.LinkLabel.OnPaint(PaintEventArgs e)
      at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
      at System.Windows.Forms.Control.WmPaint(Message& m)
      at System.Windows.Forms.Control.WndProc(Message& m)
      at System.Windows.Forms.Label.WndProc(Message& m)
      at System.Windows.Forms.LinkLabel.WndProc(Message& msg)
      at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
      at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
      at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The Zone of the assembly that failed was:  MyComputer

Нет, установка цвета по умолчанию не помогает.


Я нашел эту тему с точно такой же проблемой, но, боюсь, я не понимаю решения:

кусты реестра, загруженные LoadUserProfile, хранятся в HKU, HKCU остается кустом пользователя интерактивного входа (загруженby winlogon.exe).

Так что если вам нужно попасть в только что загруженный улей, вам нужно:
- установить Regkey в Registry.Users
- открыть подраздел, используя строку SIDучетной записи пользователя, которую вы олицетворяете.

Кто-нибудь знает какие-либо обходные пути для этого?

Ответы [ 4 ]

3 голосов
/ 09 марта 2011

Проблема в том, что вы слишком долго выдавали себя за себя, а ваш код (косвенно через .NET Framework) получает доступ к большему количеству ресурсов, чем вы предполагали при подражании. Это исключение вызвано тем, что ваш код олицетворения выполняется в потоке GUI (STA).

Вы можете:

  1. Имитировать себя в течение более короткого периода времени - только до тех пор, пока вам нужно так называть себя имитатором, а затем отменить как можно скорее. Даже если одно утверждение позже, вы должны заново выдать себя за. Это типичная модель подражания.
  2. Переместите олицетворяющий код в рабочий поток (MTA), и вам следует избегать этого конкретного симптома. Теперь у вас есть проблема, как общаться с кодом олицетворения, но это не страшно.
  3. Если вы действительно хотите, чтобы весь процесс выполнялся под системной учетной записью (возможно, с наименьшими привилегиями), единственное поддерживаемое решение, о котором я знаю, - это чтобы HKEY_CURRENT_USER был тем, к которому системная учетная запись может получить доступ. Это делается путем вызова LoadUserProfile, а затем вызова CreateProcessAsUser; но это совершенно новая архитектура для вас, чтобы запустить новый процесс обработки олицетворения.
0 голосов
/ 14 июля 2011

Для этой конкретной проблемы я просто создал ярлык (вместо ссылки), сделал его синим и подчеркнутым, и установил Cursor на Cursors.Hand. Тогда он ведет себя точно так же, как ярлык ссылки, за исключением того, что цвет ссылки не меняется в зависимости от темы пользователя (да ладно).

У меня тогда были другие проблемы с разрешениями на сохранение файлов; см. мои комментарии к ответу @ Тони выше для решения.

0 голосов
/ 10 марта 2011

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

Это также ужасно небезопасно, кстати, во всяком случае, еще хуже. Используйте вариант № 1 Тони Ли, если вы можете заставить его работать.

Попробуйте это в Regedit, прежде чем приступить к написанию кода.

0 голосов
/ 09 марта 2011

Что вы пытаетесь сделать?

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

Если пользователям нужен доступ к какому-либо ресурсу, предоставьте доступ этой группе пользователей.

Или создайте службу COM-сервера, чтобы выполнять грязную работу, и настройте ее для запуска в качестве учетной записи службы, но предоставьте пользователям права на запуск.

Действительно, вы не должнысделать это. Вы проделали дыру размером с линкор в системе безопасности Windows.

...