Доступ к реестру из веб-службы
У меня были проблемы с доступом к некоторым (но не ко всем) ключам реестра из моего веб-сервиса. Поэтому я предположил (и подтвердил некоторыми исследованиями), что существуют некоторые ограничения безопасности при доступе к реестру. Есть ли какой-то код или изменение в конфигурации, которое мне нужно сделать конкретно в моем приложении 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