Доступ к реестру из веб-службы

У меня были проблемы с доступом к некоторым (но не ко всем) ключам реестра из моего веб-сервиса. Поэтому я предположил (и подтвердил некоторыми исследованиями), что существуют некоторые ограничения безопасности при доступе к реестру. Есть ли какой-то код или изменение в конфигурации, которое мне нужно сделать конкретно в моем приложении C#.Net?

В частности, я пытаюсь прочитать и записать значения PageSetup в "Software\Microsoft\Internet Explorer\PageSetup"

2 ответа

Решение

После олицетворения пользователя HKEY_CURRENT_USER не будет изменено Вы должны использовать RegOpenCurrentUser после олицетворения пользователя и RegCloseKey.

В качестве альтернативы вы получаете SID пользователя и читаете реестр из HKEY_USERS:

WindowsIdentity wi = HttpContext.Current.User.Identity as WindowsIdentity;
if (windowsIdentity != null) {
    SecurityIdentifier si = wi.User;
    RegistryKey key = Registry.Users.OpenSubKey (si.Value +
                            @"\Software\Microsoft\Internet Explorer\PageSetup");
    // get some values which you need like
    string top_margine = key.GetValue ("margin_top");
    key.Close();
}

Вы можете использовать System.Security.Principal.WindowsIdentity.GetCurrent(), чтобы создать веб-методы, которые возвращают имя текущего пользователя (наиболее вероятно, специального пользователя ASP_NET), а затем увеличить привилегии пользователя (или изменить параметры безопасности ключ, который вы хотите отредактировать из regedit, чтобы пользователь, под которым работает ваш процесс, мог прочитать часть реестра

С другой стороны, если я прав, и вы хотите отредактировать HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PageSetup, и ваша цель не состоит в том, чтобы изменить информацию в этом ключе для пользователя ASP_NET, тогда потребуется аутентификация для вашего веб-сервис, используя учетную запись, доступную на сервере, для этого вам необходимо настроить веб-сервис на использование аутентификации windows в Web.config:

<system.web> ... <authentication mode="Windows"/> <identity impersonate="true"/> ... </system.web>

Затем вы получаете маркер Windows аутентифицированного пользователя:


IIdentity WinId= HttpContext.Current.User.Identity;
WindowsIdentity wi = (WindowsIdentity)WinId;

и, наконец, вы используете маркер Windows аутентифицированного пользователя, чтобы временно выдать себя за оригинального пользователя и удалить маркер олицетворения из текущего потока, когда вы закончите олицетворение.


// Temporarily impersonate the original user.
WindowsImpersonationContext wic = wi.Impersonate();
try
{
  // Access resources while impersonating.
}
finally
{
  // Revert impersonation.
  wic.Undo();
}

Таким образом, когда вы запросили WindowsIdentity.GetCurrent (), вы получите имя пользователя учетной записи Windows для аутентификации (это называется временно имитировать аутентифицированного пользователя). И у вас будет доступ к HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ PageSetup пользователя, которого вы использовали для аутентификации

Более подробную информацию об аутентификации и подмене Windows вы можете найти здесь: http://msdn.microsoft.com/en-us/library/ff647405.aspx

Другие вопросы по тегам