Webサービスから一部(すべてではない)のレジストリキーにアクセスするのに問題があります。したがって、レジストリへのアクセスにはセキュリティ上の制限があると想定しました(そしていくつかの調査で確認しました)。C#.Netアプリケーションで具体的に行う必要のあるコードや構成の変更はありますか?
具体的には、「Software \ Microsoft \ Internet Explorer\PageSetup」の下にあるPageSetupの値を読み書きしようとしています。
Webサービスから一部(すべてではない)のレジストリキーにアクセスするのに問題があります。したがって、レジストリへのアクセスにはセキュリティ上の制限があると想定しました(そしていくつかの調査で確認しました)。C#.Netアプリケーションで具体的に行う必要のあるコードや構成の変更はありますか?
具体的には、「Software \ Microsoft \ Internet Explorer\PageSetup」の下にあるPageSetupの値を読み書きしようとしています。
System.Security.Principal.WindowsIdentity.GetCurrent()を使用して、現在のユーザー(ほとんどの場合は特別なASP_NETユーザー)の名前を返すWebメソッドを作成し、ユーザーの特権を増やす(またはのセキュリティ設定を変更する)ことができます。プロセスを実行しているユーザーがレジストリの一部を読み取れるように、regeditから編集するキー
一方、私が正しく、HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ PageSetupを編集したい場合、ASP_NETユーザーのそのキーの情報を変更しないことが目標である場合は、認証する必要があります。サーバーマシンで使用可能なアカウントを使用するWebサービス。そのためには、Web.configでWindows認証を使用するようにWebサービスを構成する必要があります。
<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を参照してください。
ユーザーのなりすまし後HKEY_CURRENT_USER
は変更されません。ユーザーとRegCloseKeyを偽装した後は、 RegOpenCurrentUserを使用する必要があります。
または、ユーザーの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();
}