簡體   English   中英

C#和.NET 3.5 - 如何使用不同的憑據啟動進程,使用隱藏窗口,並能夠捕獲標准輸出和退出代碼?

[英]C# and .NET 3.5 - How to launch a process using different credentials, with a hidden window, and being able to capture standard output and exit code?

我有一個用C#和.NET 3.5開發的Windows服務,可以在我們的3個域中執行各種管理任務。 我在每個域中都有一個管理員帳戶,該帳戶對此服務的操作具有必要的權限/權限。

對於所有AD交互,我可以使用域的正確用戶名/密碼綁定到AD,一切都很好。 但是,我現在需要啟動一個外部進程(robocopy)來執行一些工作,我無法在.NET 3.5中找到任何代碼示例。

我需要做的是在隱藏窗口中使用備用憑據啟動robocopy,捕獲標准輸出,以便記錄實際完成的內容,並捕獲退出代碼,以便我可以判斷它是否成功。

我從K. Scott Allen的博客中找到了一些舊的.NET 1.1代碼(請參閱最后幾條評論,以獲得良好的代碼清單),該代碼擴展了System.Diagnostics.Process對象並調用了Win32 API函數CreateProcessAsUserW。 但是,由於.NET 2.0中的某些API更改,代碼不起作用。 使用反射引用博客的最后一條注釋中的代碼片段,當我嘗試與進程交互時(使用反射來殺死它或獲取退出代碼),它會使用反射來調用Process對象的私有SetProcessHandle函數。

有沒有人有一個很好的例子來說明如何實現這一目標?

編輯:內置的.NET Process和ProcessStartInfo API允許您指定備用憑據,但是當您這樣做時,它希望創建一個可見窗口(即使您指定CreateNoWindow或WindowStyle Hidden),它在作為Windows服務運行時失敗。 所以這些不是這個應用程序的選項。 模擬不起作用,因為啟動外部進程時,它使用父進程的憑據,而不是模擬憑據。

解決方案:正如Reed在下面指出的那樣,使用其中一個Win32 API函數進行P / Invoke可以讓你實現這一點。 我最后使用一個名為RunProcess的舊免費軟件NT4實用程序 ,它允許您在命令行上指定用戶名/密碼。 它適用於Vista和2k3,並且在由作為本地系統運行的Windows服務啟動時也能正常工作。

我想你想看看:

的ProcessStartInfo

這提供了一種.NET方法,可以在具有不同憑據的不同用戶下啟動進程。 不再需要Win32 API。

---編輯---

其他替代方法可能是使用此處指定的P / Invoke(首先查看底部的注釋)或更可能使用P / Invoke和CreateProcessWithLogonW

只是一個未經證實的想法,但是沒有使用動態Impersonate對.net 2+中的整個代碼塊有效嗎? 因此,模擬所需的用戶,然后在模擬的上下文/范圍內執行任何操作,例如以正常方式啟動進程? 認為我們做了類似的事情來集成使用已提供的憑據啟動mstsc.exe。

如果您想查看實際使用的退出代碼,請查看www.robocopyplus.com。 它就像一個robocopy包裝器,為電子郵件通知和報告過濾添加swicthes。 這可能已經做了一些你想要實現的東西。

這應該適用於Process類和ProcessStartInfo

不同的憑證:

重定向標准輸出:

退出代碼:

StartInfo有一個名為CreateNoWindow的屬性,可以讓Reed的建議為你工作。

暫無
暫無

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

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