簡體   English   中英

如何從IIS托管的WCF服務啟動進程?

[英]How to start a process from an IIS hosted WCF service?

我想從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服務托管為在admin用戶下運行的自托管控制台應用程序,並且我看到記事本在另一個用戶下啟動,則此代碼有效。 它在IIS上失敗,沒有異常,但進程立即終止

process.HasExited = true;
process.ExitCode = -1073741502;

在IIS上,WCF應用程序在具有管理員權限的用戶下運行,並且已在web.config中定義完全信任。 我不能使用自托管應用程序,因為它不支持簡單的持續交付(例如帶有IIS Web場的WebDeploy)。

問:如何從IIS上托管的WCF服務啟動服務器端的進程?

編輯:
我偶然發現了這篇文章 ,遇到了類似的問題,我嘗試了所有的方法,包括Process.Start和P / Invoke與CreateProcessWithLogonW和CreateProcessAsUser的所有可能變體我還試圖向用戶授予其他權限。 不適用於與該人發布的錯誤消息相同的錯誤消息。

Oleksii,重點是,如果您在控制台應用程序中托管WCF服務,則會為該用戶創建一個Windows會話(已登錄並加載Windows資源管理器),並為該用戶打開並顯示記事本,因此您可以看到它在UI中。

當您在IIS中托管WCF服務作為服務器時,IIS要求並且不允許用戶交互,並且如果沒有用戶登錄則也可以工作; 在這種情況下,沒有用於托管記事本或其他支持UI的應用程序的UI,您可以執行精心制作或其他批處理作業的流程,但不能渲染Windows UI應用程序,因為沒有為您加載Windows資源管理器,也沒有地方可以渲染流程的UI。

這是我用來調用GnuPGP進行加密的方法。 您的設置如何比較?

private int ExecuteCommand(string arguments, string passPhrase, int timeout)
        {
            Process processObject;
            ProcessStartInfo pInfo = new ProcessStartInfo(_executablePath, arguments);


            pInfo.CreateNoWindow = true;
            pInfo.UseShellExecute = false;

            pInfo.RedirectStandardInput = true;
            pInfo.RedirectStandardOutput = true;
            pInfo.RedirectStandardError = true;
            processObject = Process.Start(pInfo);

            if (!string.IsNullOrEmpty(passPhrase))
            {
                processObject.StandardInput.WriteLine(passPhrase);
                processObject.StandardInput.Flush();
            }

            string result = processObject.StandardOutput.ReadToEnd();
            string error = processObject.StandardError.ReadToEnd();

            if (!processObject.WaitForExit(timeout))
            {
                throw new TimeoutException("GnuPG operation timeout. Waited " + timeout + " milliseconds ");
            }

            int exitcode = processObject.ExitCode;

            Error = error;
            Output = result;

            return exitcode;

        }

有一個apppool設置,以確保它加載用戶配置文件。

loadUserProfile Optional Boolean attribute.

Specifies whether IIS loads the user profile for the application pool identity. Setting    
this value to false causes IIS to revert to IIS 6.0 behavior. IIS 6.0 does not load the 
user profile for an application pool identity.

The default value is false.

與作為具有足夠權限的身份的域用戶一起工作可能會起作用? 我知道用戶至少需要一個用戶檔案。

也就是說,這是一個奇怪的架構。 看起來更好的方法是擁有一個持久的進程,就像站點與之通信的Windows服務一樣,但我不確定你的約束是什么。

希望有所幫助。

暫無
暫無

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

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