C# 启动ASP.net页面上的服务

C# 启动ASP.net页面上的服务,c#,asp.net,service,windows-services,C#,Asp.net,Service,Windows Services,我写了一个windows服务,它工作得很好。它是通过ChatServer.exe{argument}调用的(在命令提示下),其中{argument}是一项关键工作,如安装,卸载,启动和停止 此服务所在的程序需要管理权限(因为它自己安装/卸载)。因此,例如,如果我以管理员身份启动cmd“D:\folder\chatserver.exe install”,它将按其应该的方式安装服务 嗯,我的问题是,在我的ASP.net站点上,我编写了一个函数(如下)来启动进程,但是我得到了一个异常“740”(“软件

我写了一个windows服务,它工作得很好。它是通过
ChatServer.exe{argument}
调用的(在命令提示下),其中
{argument}
是一项关键工作,如
安装
卸载
启动
停止

此服务所在的程序需要管理权限(因为它自己安装/卸载)。因此,例如,如果我以管理员身份启动
cmd
“D:\folder\chatserver.exe install”,它将按其应该的方式安装服务

嗯,我的问题是,在我的ASP.net站点上,我编写了一个函数(如下)来启动进程,但是我得到了一个异常
“740”(“软件所需的特权提升”)
,好像我将函数的“AsAdmin”参数标记为“true”,我得到了
“UseShellExecute”
不能作为异常为true

public static int RunProcess(string ApplicationPath, string Parameters = "", bool AsAdmin = false)
{
    try
    {
        global::System.Diagnostics.ProcessStartInfo startInfo = new global::System.Diagnostics.ProcessStartInfo();
        startInfo.UseShellExecute = AsAdmin;
        if (AsAdmin) { startInfo.Verb = "runas"; }
        startInfo.WorkingDirectory = global::System.IO.Path.GetDirectoryName(ApplicationPath);
        startInfo.FileName = ApplicationPath;
        if (!string.IsNullOrEmpty(Parameters)) { startInfo.Arguments = Parameters; }
        startInfo.ErrorDialog = false;
        global::System.Diagnostics.Process process = global::System.Diagnostics.Process.Start(startInfo);
        process.WaitForExit();
        return process.ExitCode;
    }
    catch (global::System.ComponentModel.Win32Exception ex) { return ex.NativeErrorCode; }
    catch { return -1; }
}

我该怎么办?

您是否尝试过
ProcessStartInfo
?它允许您添加特定的
凭证
。检查以下示例:

ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.UserName = username;
myProcess.Password = MakeSecureString(password);
myProcess.WorkingDirectory = @"C:\Windows\System32";
myProcess.UseShellExecute = false;
// elevate EDIT
myProcess.Verb = "runas";
Process.Start(myProcess);


private static SecureString MakeSecureString(string text)
{
     SecureString secure = new SecureString();
     foreach (char c in text)
     {
         secure.AppendChar(c);
     }
     return secure;
}

您是否尝试过
ProcessStartInfo
?它允许您添加特定的
凭证
。检查以下示例:

ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.UserName = username;
myProcess.Password = MakeSecureString(password);
myProcess.WorkingDirectory = @"C:\Windows\System32";
myProcess.UseShellExecute = false;
// elevate EDIT
myProcess.Verb = "runas";
Process.Start(myProcess);


private static SecureString MakeSecureString(string text)
{
     SecureString secure = new SecureString();
     foreach (char c in text)
     {
         secure.AppendChar(c);
     }
     return secure;
}

除了Ted的回答,我还要补充一点:

Microsoft不建议从Web应用程序/站点调用.exe,因为出于安全原因,w3wp.exe在沙盒环境中运行,因此它启动的任何线程/任务/进程都与您自己启动时的线程/任务/进程不同,因此可能无法按预期工作


您可能希望将控制台应用程序重新编码为ASP.NET Web API,可能托管在IIS或Windows服务中。

对于Ted的回答,我将添加以下内容:

Microsoft不建议从Web应用程序/站点调用.exe,因为出于安全原因,w3wp.exe在沙盒环境中运行,因此它启动的任何线程/任务/进程都与您自己启动时的线程/任务/进程不同,因此可能无法按预期工作


您可能希望将控制台应用程序重新编码为ASP.NET Web API,可能托管在IIS或Windows服务中。

您不能也不应该这样做。您不希望将管理凭据存储在web应用程序附近的任何位置,而且您肯定不希望在管理权限下运行web应用程序

一种解决方案是实际拥有一个“看门狗”Windows服务,该服务以适当的权限运行,以与服务控制管理器(SCM)交互,后者通过本地主机上的WCF接受命令,并让您的web应用程序与该服务对话,该服务反过来启动或停止相应的服务

看起来是这样的:

[Web Application] -- WCF --> [Watchdog Service] -- SCM --> [Chat Service]
因此,Web应用程序通过WCF发送
StartService(“ChatService”)
命令,然后看门狗服务启动ChatService服务

现在,只有看门狗服务必须在管理权限下运行,并且要保护WCF通信,以确保只有经过身份验证的应用程序才能调用它,这在其他问题中进行了讨论


如果你尝试开发一个包括网站和服务的自安装Web平台,那么考虑使用一个合适的安装程序,而不是手工完成。

你不能,也不应该这样做。您不希望将管理凭据存储在web应用程序附近的任何位置,而且您肯定不希望在管理权限下运行web应用程序

一种解决方案是实际拥有一个“看门狗”Windows服务,该服务以适当的权限运行,以与服务控制管理器(SCM)交互,后者通过本地主机上的WCF接受命令,并让您的web应用程序与该服务对话,该服务反过来启动或停止相应的服务

看起来是这样的:

[Web Application] -- WCF --> [Watchdog Service] -- SCM --> [Chat Service]
因此,Web应用程序通过WCF发送
StartService(“ChatService”)
命令,然后看门狗服务启动ChatService服务

现在,只有看门狗服务必须在管理权限下运行,并且要保护WCF通信,以确保只有经过身份验证的应用程序才能调用它,这在其他问题中进行了讨论


如果你尝试开发一个包括网站和服务的自安装Web平台,那么考虑使用一个合适的安装程序,而不是手工完成。难以置信的事情,我知道,但如果忘记!我怎么可能?尝试过了,这很有意义,但我仍然得到“Win32Exception”,“请求的操作需要提升”@SammuelMiranda-请参阅我的编辑
myProcess.Verb=“runas”好的,明白了!当我给出管理员(windows用户管理员)和密码而不是用户帐户和密码时,它起作用了(即使没有动词)。我将保留动词,以便我可以与用户(同时也是管理员)thansk ted一起尝试!难以置信的事情,我知道,但如果忘记!我怎么可能?尝试过了,这很有意义,但我仍然得到“Win32Exception”,“请求的操作需要提升”@SammuelMiranda-请参阅我的编辑
myProcess.Verb=“runas”好的,明白了!当我给出管理员(windows用户管理员)和密码而不是用户帐户和密码时,它起作用了(即使没有动词)。我将保留动词,以便我可以与爱尔兰用户(也就是管理员)一起尝试,谢谢你的回答,但只是为了澄清一下,这是一个WINDOWS服务,漏洞在于使我的ASP.net页面能够调用该服务的开始/停止。我曾在MS支持工程师那里接受过一次关于这个问题的培训。底线是我们不应该从Web应用程序调用Windows服务。这是可以做到的,但不是“微软支持的”。Irish,谢谢你的回答,但我要澄清的是,这是一项WINDOWS服务,漏洞在于使我的ASP.net页面能够调用该服务的开始/停止。我曾经在MS支持工程师那里接受过一次关于这个问题的培训。底线是我们不应该从Web调用Windows服务