我在WCF服务和模拟方面遇到了一些问题,我将其提炼为下面的一个简单方法。WCF服务当前自托管在exe中。异常消息为"未提供所需的模拟级别,或者提供的模拟级别无效"。在抛出错误时进行检查,将Identity ImpersonationLevel设置为委派,如在我的客户端上指定的,并通过Kerberos对其进行身份验证。
我有点困惑,因为在我看来,模拟水平和真实性的要求已经得到了满足。我的想法是,这个问题可能与域设置有关,我已经设置并认为这些设置是正确的。所以我有两个问题:
- 下面的操作应该成功吗?(或者它有缺陷吗?)
- 需要在Win2k8域上配置哪些设置才能使其工作?我正在处理两个盒子,它们是同一个Win2k8域的成员(这是一个新域,非常普通,目的是测试模拟)
代码如下:
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Test()
{
WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
ProcessStartInfo pi = new ProcessStartInfo(@"c:temptest.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%
-
只要你在使用,它就有缺陷。NET进程类,它将始终以父进程的标识开头。要在另一个身份下运行它,看起来你必须使用win32api CreateProcessAsUser(我还没有使用它)。
-
我需要提升运行它(即Visual Studio作为管理员)。
这解决了我的应用程序的问题:
- 转到"开始">"设置">"控制面板">"管理工具">"本地安全策略"展开"本地策略"并选择"用户权限分配"
- 在右侧窗格中,双击验证后模拟客户端
- 在"安全策略设置"对话框中,单击"添加用户或组"
- 在"选择用户、计算机或组"对话框中,键入
IIS_IUSRS
- 选择"检查名称"并验证名称是否正确
来源:500内部服务器错误,如果未输入完整路径(0x80070542)