4

私のアプリはサービス アカウントを偽装する必要がありますLogonUser。ただし、.Net ライブラリ内のランダムなコンポーネントが、アカウントがアクセスできないレジストリ キーにアクセスしようとすると、エラーが発生するSecurityExceptionようです。

具体的には、をロードするLinkLabelと、IE でデフォルトのハイパーリンクの色を決定しようとしてクラッシュします。

System.Security.SecurityException: 要求されたレジストリ アクセスは許可されていません。
      System.ThrowHelper.ThrowSecurityException (ExceptionResource リソース) で
      Microsoft.Win32.RegistryKey.OpenSubKey (文字列名、書き込み可能なブール値) で
      Microsoft.Win32.RegistryKey.OpenSubKey (文字列名) で
      System.Windows.Forms.LinkUtilities.GetIEColor (文字列名) で
      System.Windows.Forms.LinkUtilities.get_IELinkColor() で
      System.Windows.Forms.LinkLabel.get_LinkColor() で
      System.Windows.Forms.LinkLabel.OnPaint (PaintEventArgs e) で
      System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e、Int16 レイヤー、ブール値の disposeEventArgs) で
      System.Windows.Forms.Control.WmPaint (メッセージ & m) で
      System.Windows.Forms.Control.WndProc (メッセージ & m) で
      System.Windows.Forms.Label.WndProc (メッセージ & m) で
      System.Windows.Forms.LinkLabel.WndProc (メッセージ & メッセージ) で
      System.Windows.Forms.Control.ControlNativeWindow.OnMessage (メッセージ & m) で
      System.Windows.Forms.Control.ControlNativeWindow.WndProc (メッセージ & m) で
      System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd、Int32 メッセージ、IntPtr wparam、IntPtr lparam) で
失敗したアセンブリのゾーン: MyComputer

いいえ、デフォルトの色を設定しても役に立ちません。


まったく同じ問題でこのスレッドを見つけましたが、解決策がわかりません。

読み込まれたレジストリ ハイブLoadUserProfileは HKU に格納され、HKCU は対話型ログオン ユーザーのハイブ (winlogon.exe によって読み込まれる) のままです。

したがって、新しくロードされたハイブを取得する必要がある場合は、次のことを行う必要があります。 -に
設定 - 偽装しているユーザー アカウントの文字列 SID を使用してサブキーを開きます。RegkeyRegistry.Users

これに対する回避策を知っている人はいますか?

4

4 に答える 4

3

問題は、偽装している時間が長すぎて、コードが (.NET フレームワークを介して間接的に) 偽装中に意図したよりも多くのリソースにアクセスしていることです。この例外は、偽装コードが GUI (STA) スレッドで実行されていることが原因のようです。

あなたはできる:

  1. より短い期間のなりすまし - 必要な間のみ、なりすましを呼び出してから、できるだけ早く元に戻します。後で 1 つのステートメントであっても、再度偽装する必要があります。これは典型的な偽装パターンです。
  2. 偽装コードをワーカー (MTA) スレッドに移動すると、この特定の現象を回避する必要があります。偽装コードと通信する方法の問題がありますが、それほどひどいものではありません。
  3. プロセス全体をシステム アカウントとして (おそらく最小限の特権として) 実行したい場合、私が知っているサポートされている唯一の解決策は、HKEY_CURRENT_USER をシステム アカウントがアクセスできるものにすることです。これは、LoadUserProfile を呼び出してから CreateProcessAsUser を呼び出すことによって行われます。しかし、これは偽装を処理する新しいプロセスをスピンするためのまったく新しいアーキテクチャです。
于 2011-03-08T23:53:54.933 に答える
0

この特定の問題については、(linklabel の代わりに) ラベルを作成し、青色で下線を引き、 を に設定しCursorましたCursors.Hand。次に、リンクの色がユーザーのテーマによって変更されないことを除いて、リンクラベルとまったく同じように動作します (まあ)。

その後、ファイルを保存するためのアクセス許可に関して別の問題が発生しました。解決策については、上記の @Tony の回答に対する私のコメントを参照してください。

于 2011-07-14T03:59:30.967 に答える
0

あなたは何をしようとしているのですか?

サービス アカウントを偽装する必要があるのはなぜですか? それは良い考えのようには思えません。そのように促された問題が何であれ、それを解決する別の方法を見つけることをお勧めします。

ユーザーが何らかのリソースにアクセスする必要がある場合は、そのユーザー グループにアクセス権を付与します。

または、面倒な作業を行う COM サーバー サービスを作成し、それをサービス アカウントとして実行するように構成しますが、ユーザーに起動権限を付与します。

本当はこれをしてはいけません。あなたは、Windows セキュリティに戦艦と同じくらい大きな穴を開けています。

于 2011-03-09T07:31:40.883 に答える
0

問題は、サービス アカウントが HKEY_CURRENT_USER にアクセスできないことです。サービス アカウントへの読み取りアクセスを許可する HKEY_CURRENT_USER ハイブに ACE を追加することで、問題を解決できる場合があります。

ちなみに、これはさらに悪いことに、恐ろしく安全ではありません。機能させることができる場合は、Tony Lee の一番のオプションを使用してください。

わざわざコードを書く前に、Regedit で試してみてください。

于 2011-03-09T21:44:31.553 に答える