【发布时间】:2011-11-04 18:54:43
【问题描述】:
我想从 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 服务托管为在管理员用户下运行的自托管控制台应用程序,并且我看到记事本在另一个用户下启动,则此代码有效。它在 IIS 上毫无例外地失败,但进程立即终止
process.HasExited = true;
process.ExitCode = -1073741502;
在 IIS 上,WCF 应用程序在具有管理员权限的用户下运行,并且在 web.config 中定义了完全信任。我不能使用自托管应用程序,因为它不支持简单的持续交付(例如带有 IIS 网络场的 WebDeploy)。
问:如何从托管在 IIS 上的 WCF 服务在服务器端启动进程?
编辑:
我偶然发现了这个post,有类似的问题,我尝试了那里的所有方法,包括 Process.Start 和 P/Invoke 的所有可能变体,使用 CreateProcessWithLogonW 和 CreateProcessAsUser 我还尝试向用户授予额外权限。这不适用于与该人发布的错误消息相同的错误消息。
【问题讨论】:
-
有完整源代码示例的最终解决方案吗?
-
没有肮脏的黑客是不可能的。我没有这样做。
-
我没说清楚。你不能做这个。尝试使用
CreateProcessWithLogonW或CreateProcessAsUser进行身份验证时的事件。这不受操作系统支持,被认为是一个安全漏洞,因此您无法合法地进行这项工作。恶意软件会这样做,但我不是该领域的专家,而且安全漏洞通常会很快得到修补。