我希望能够从内部网络客户端在WCF服务端运行一个进程。在我的情况下,客户端请求服务器在提供的凭据下在服务器机器上创建一个新进程。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 Web农场的WebDeploy)。
问题:如何从在IIS上托管的WCF服务中启动服务器端进程?
编辑: 我偶然发现了这个post,其中有类似的问题,我尝试了那里的所有方法,包括使用Process.Start和P/Invoke的CreateProcessWithLogonW和CreateProcessAsUser的所有可能变体,我还尝试授予用户附加权限。但是,所有这些都无法正常工作,错误消息与该人发布的相同。
CreateProcessWithLogonW
或CreateProcessAsUser
进行身份验证,操作系统也不支持此操作,因为它被视为安全漏洞,所以你无法合法地使其工作。恶意软件可以这样做,但我不是那个领域的专家,而且安全漏洞通常会很快得到修补。 - oleksii