Доступ к реестру из веб-службы - PullRequest
0 голосов
/ 22 сентября 2010

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

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

Ответы [ 2 ]

0 голосов
/ 22 сентября 2010

После олицетворения пользователя 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();
}
0 голосов
/ 22 сентября 2010

Вы можете использовать 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

...