10

WCFサービスと偽装に問題があります。これを以下の簡単な方法にまとめました。WCFサービスは、現在exeで自己ホストされています。例外メッセージは、「必要な偽装レベルが提供されなかったか、提供された偽装レベルが無効です」です。エラーがスローされるタイミングを確認すると、Identity ImpersonationLevelは、クライアントで指定されているように委任に設定され、Kerberosを介して認証されます。

ImpersonationLevelとAuthenticaitonの要件が満たされているように見えるので、少し戸惑っています。私の考えでは、問題はおそらく私が設定したドメイン設定に関係していて、正しく設定されていると思います。だから私は2つの質問があります:

  1. 以下の操作は成功するはずですか?(またはそれは欠陥がありますか?)
  2. Win2k8ドメインを機能させるには、どのような設定を構成する必要がありますか?私は同じWin2k8ドメインのメンバーである2つのボックスで作業しています(偽装をテストする目的で、新しいドメインとかなりバニラです)。

次のようにコーディングします。

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Test()
{
    WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
    using (identity.Impersonate())
    {
        ProcessStartInfo pi = new ProcessStartInfo(@"c:\temp\test.bat");
        pi.UseShellExecute = false;
        pi.RedirectStandardOutput = true;
        Process p = Process.Start(pi); // exception thrown here!
        p.WaitForExit();
        string o = p.StandardOutput.ReadToEnd();
        return o;
    }
}

例外の詳細:

Win32Exception occurred: Either a required impersonation level was not provided, or the provided impersonation level is invalid
   at System.Diagnostics.Process.CreatePipeWithSecurityAttributes(SafeFileHandle& hReadPipe, SafeFileHandle& hWritePipe, SECURITY_ATTRIBUTES lpPipeAttributes, Int32 nSize)
   at System.Diagnostics.Process.CreatePipe(SafeFileHandle& parentHandle, SafeFileHandle& childHandle, Boolean parentInputs)
   at System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
   at System.Diagnostics.Process.Start()
   at System.Diagnostics.Process.Start(ProcessStartInfo startInfo)
   at MonetEnterprise.Service.SecurityService.Test()

Test.batファイルの内容

エコー%username%

4

2 に答える 2

9
  1. .NET Processクラスを使用している限り、欠陥があり、常に親プロセスのIDで開始されます。別のIDで実行するには、win32 api CreateProcessAsUser(まだ機能していません)を使用する必要があるようです。

  2. 私はそれを昇格して実行する必要がありました(つまり、管理者としてのVisual Studio)。

于 2012-09-06T07:46:02.263 に答える
1

これにより、私のアプリケーションの問題が解決しました。

  1. [スタート]>[設定]>[コントロールパネル]>[管理ツール]>[ローカルセキュリティポリシー]に移動し、[ローカルポリシー]を展開して[ユーザー権利の割り当て]を選択します
  2. 右側のペインで、[認証後にクライアントを偽装する]をダブルクリックします
  3. [セキュリティポリシーの設定]ダイアログボックスで、[ユーザーまたはグループの追加]をクリックします
  4. [ユーザー、コンピューター、またはグループの選択]ダイアログボックスで、次のように入力します。IIS_IUSRS
  5. [名前の確認]を選択して、名前が正しいことを確認します

ソース:フルパスが入力されていない場合の500内部サーバーエラー(0x80070542)

于 2020-06-15T22:56:10.073 に答える