簡體   English   中英

以ASP.net頁面啟動服務

[英]Start a Service thought ASP.net Page

我寫了一個Windows服務,效果很好。 它是通過ChatServer.exe {argument}調用的(在命令提示符下),其中{argument}是諸如installuninstallstartstop類的關鍵工作。

該服務所在的程序需要管理特權(因為它本身可以安裝/卸載)。 因此,例如,如果我以管理員"D:\\folder\\chatserver.exe install"身份啟動cmd ,它將"D:\\folder\\chatserver.exe install"安裝該服務。

好吧,我的問題是我在ASP.net站點上編寫了一個函數(如下所示)來啟動該過程,但出現異常"740" ("the software required privilege elevation") ,就像我標記了“ AsAdmin”自變量一樣我的功能為“真”,我得到"UseShellExecute"不能為真是一個例外。

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 它允許您添加特定的credentials 檢查以下示例:

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;
}

在另一個用戶的憑據下啟動進程

您不能也不應該這樣做。 您不想將管理憑據存儲在Web應用程序附近的任何位置,並且絕對不想在管理特權下運行 Web應用程序。

一種解決方案是實際上擁有一個“看門狗” Windows服務,該服務以適當的特權運行以與服務控制管理器(SCM)進行交互,該服務控制器通過localhost上的WCF接受命令,並讓您的Web應用程序與該服務進行通訊,打開或停止適當的服務。

看起來像這樣:

[Web Application] -- WCF --> [Watchdog Service] -- SCM --> [Chat Service]

因此,您的Web應用程序通過WCF發送StartService("ChatService")命令,然后看門狗服務啟動ChatService服務。

現在,只有Watchdog Service才能在管理特權下運行,並確保WCF通信的安全,以確保只有經過身份驗證的應用程序才能調用它,這在其他問題中進行了討論。

相反,如果您嘗試開發包括網站和服務的自安裝Web平台,請考慮使用適當的安裝程序,而不是手動完成所有操作。

除了Ted的回答,我將添加以下內容:

Microsoft不建議從Web應用程序/站點調用.exe,因為出於安全原因w3wp.exe在沙盒環境中運行,因此它啟動的任何線程/任務/進程都與您自己啟動它的方式不同。因此可能無法正常工作。

您可能希望將控制台應用程序重新編碼為ASP.NET Web API,可能托管在IIS或Windows Service中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM