簡體   English   中英

使用WCF通過WMI啟動遠程進程

[英]Using WCF to start a remote process by WMI

我想通過從WCF服務調用WMI在遠程計算機上啟動一個進程(非交互式,小型控制台應用程序)。 這是用戶將從Web應用程序運行的WCF操作。

我實現了codeproject中的代碼,並且對InvokeMethod函數的操作失敗。 錯誤是“訪問被拒絕。 (來自HRESULT的異常:0x80070005(E_ACCESSDENIED)”。

我使用WBEMTEST工具測試了WMI連接,它在同一域和另一域中的PC上都可以與同一組參數(到遠程服務器的路徑,用戶名/密碼,要運行的應用程序的路徑)一起使用,效果很好。 本教程中一樣設置用於模擬的帳戶。 由於它與WBEMTEST一起使用,因此在使用WCF進行此調用時是否需要檢查某些特定的事項? 我讀到在web.config的診斷部分將wmiProviderEnabled設置為'true'可能會有所幫助,但沒有幫助。

最后,我能夠解決此問題。

首先,我將本文在“啟用WMI”和“安全性”段落中描述的所有內容應用於配置。 這還不夠,在我的調查中,我發現上述codeproject源代碼中可能存在錯誤。 在ProcessMethod類中的StartProcess函數中,未將connectionScope添加到ManagementClass中。 因此,我向構造函數添加了ManagementScope connectionScope參數,然后填充了processTask.Scope。 請看看我更新的StartPtocess函數:

public static int StartProcess(string machineName, string processPath, ManagementScope connnectionScope, int timeout)
{
    ManagementClass processTask = new ManagementClass(@"\\" + machineName + @"\root\CIMV2",
                                                                    "Win32_Process", null);
    processTask.Scope = connnectionScope;
    ManagementBaseObject methodParams = processTask.GetMethodParameters("Create");
    methodParams["CommandLine"] = processPath;
    InvokeMethodOptions options = new InvokeMethodOptions();
    options.Timeout = TimeSpan.FromSeconds(timeout);
    ManagementBaseObject exitCode = processTask.InvokeMethod("Create", methodParams, null);

    return Convert.ToInt32(exitCode["ReturnValue"].ToString());
}

ManagementScope在ProcessLocal / ProcessRemote構造函數中創建。

這解決了我的問題。 希望它可以幫助某人。

暫無
暫無

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

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