未提供所需的模拟级别,或者提供的模拟级别无效

时间:2012-09-04 10:41:22

标签: c# wcf impersonation windows-security

我在使用WCF服务和模拟时遇到了一些问题,我已将其提炼为下面的简单方法。 WCF服务目前在exe中自托管。异常消息是“未提供所需的模拟级别,或者提供的模拟级别无效”。检查错误何时抛出,Identity ImpersonationLevel设置为委托,如我的客户端上指定的,并通过Kerberos进行身份验证。

我有点疑惑,因为在我看来ImpersonationLevel和Authenticaiton的要求已经得到满足。我的想法是问题可能与域设置有关,我已经设置并认为设置正确。所以我有两个问题:

  1. 下面的操作应该成功吗? (或者它有缺陷吗?)
  2. 需要在Win2k8域上配置哪些设置才能使其正常工作?我正在使用两个属于同一个Win2k8域名的盒子(它是一个新的域名和非常的香草,旨在测试模拟)。
  3. 代码如下:

    [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文件内容

      

    echo%username%

2 个答案:

答案 0 :(得分:7)

  1. 只要您使用的是.NET Process类,它就会有缺陷,它始终以父进程的标识开头。要在另一个身份下运行它,看起来你必须使用win32 api CreateProcessAsUser(我还没有工作)。

  2. 我需要提升它(即Visual Studio作为管理员)。

答案 1 :(得分:1)

这解决了我的应用程序的问题:

  1. 转到“开始”>“设置”>“控制面板”>“管理工具”>“本地安全策略” 展开本地策略,然后选择用户权限分配
  2. 在右窗格中,双击身份验证后模拟客户端
  3. 在“安全策略设置”对话框中,单击“添加用户或组”
  4. 在“选择用户,计算机或组”对话框中,键入IIS_IUSRS
  5. 选择“检查名称”并确认名称正确

来源:500 Internal Server Error if the full path is not entered (0x80070542)