我想从WCF服务端的Intranet客户端运行进程。在我的情况下,客户端要求服务器在提供的凭据下在服务器的机器上创建新进程。 WCF服务托管在IIS 7.5上,我使用此代码
启动进程var processInfo = new ProcessStartInfo("C:\\Windows\\System32\\notepad.exe")
{
UserName = "some user",
Password = MakeSecureString("some password"),
UseShellExecute = false,
LoadUserProfile = true
};
Process process = Process.Start(processInfo);
如果我将WCF服务托管为在admin用户下运行的自托管控制台应用程序,并且我看到记事本在另一个用户下启动,则此代码有效。它在IIS上失败,没有异常,但进程立即终止
process.HasExited = true;
process.ExitCode = -1073741502;
在IIS上,WCF应用程序在具有管理员权限的用户下运行,并且已在web.config中定义完全信任。我不能使用自托管应用程序,因为它不支持简单的持续交付(例如带有IIS Web场的WebDeploy)。
问:如何从IIS上托管的WCF服务启动服务器端的进程?
编辑:
我偶然发现了post这个类似的问题,我尝试了所有方法,包括Process.Start和P / Invoke与CreateProcessWithLogonW和CreateProcessAsUser的所有可能变体我还试图向用户授予其他权限。如果不是这样,那么错误消息将与该人发布的错误消息相同。
答案 0 :(得分:4)
Oleksii,重点是,如果您在控制台应用程序中托管WCF服务,则会为该用户创建一个Windows会话(已登录并加载Windows资源管理器),并为该用户打开并显示记事本,你在UI中看到它。
当您在IIS中托管WCF服务时,作为服务器,IIS需要并且不允许用户交互,并且如果没有用户登录也可以工作;在这种情况下,没有用于托管记事本或其他支持UI的应用程序的UI,您可以执行精心制作或其他批处理作业的流程,但不能渲染Windows UI应用程序,因为没有为您加载Windows资源管理器,也没有地方可以渲染流程的UI。
答案 1 :(得分:1)
这是我用来调用GnuPGP进行加密的方法。您的设置如何比较?
private int ExecuteCommand(string arguments, string passPhrase, int timeout)
{
Process processObject;
ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments);
pInfo.CreateNoWindow = true;
pInfo.UseShellExecute = false;
pInfo.RedirectStandardInput = true;
pInfo.RedirectStandardOutput = true;
pInfo.RedirectStandardError = true;
processObject = Process.Start(pInfo);
if (!string.IsNullOrEmpty(passPhrase))
{
processObject.StandardInput.WriteLine(passPhrase);
processObject.StandardInput.Flush();
}
string result = processObject.StandardOutput.ReadToEnd();
string error = processObject.StandardError.ReadToEnd();
if (!processObject.WaitForExit(timeout))
{
throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds ");
}
int exitcode = processObject.ExitCode;
Error = error;
Output = result;
return exitcode;
}
答案 2 :(得分:1)
有一个apppool设置,以确保它加载用户个人资料。
loadUserProfile Optional Boolean attribute.
Specifies whether IIS loads the user profile for the application pool identity. Setting
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the
user profile for an application pool identity.
The default value is false.
这与作为域用户一起作为具有足够权限的身份可能会起作用吗?我知道用户至少需要一个用户档案。
那就是说,它有点奇怪的架构。似乎一个更好的拱门是拥有一个持久的过程,如网站服务,网站与之沟通,但我不确定你的约束是什么。
希望有所帮助。