2013-05-20 251 views
0

我需要從C#代碼運行「manage-bde」shell命令。以C#管理員身份運行shell命令(manage-bde)

主應用程序進程已經以管理員身份運行,並且處於高位。

我使用了以下代碼:MS網站上的UAC自升高示例,用於確認應用程序進程是否升級。 (http://code.msdn.microsoft.com/windowsdesktop/CSUACSelfElevation-644673d3

但是,當我嘗試從C#代碼運行manage-bde時,出現「系統找不到指定的文件」。

 Process p = new Process(); 
     p.StartInfo.FileName = "C:\\Windows\\System32\\manage-bde.exe"; 
     p.StartInfo.UseShellExecute = true; 
     p.Start(); 

作爲解決方法,我嘗試創建一個運行該命令的批處理文件。

 string batchFileName = DateTime.Now.Ticks + ".bat"; 
     StreamWriter writer = new StreamWriter(batchFileName); 
     writer.WriteLine("manage-bde"); 
     writer.Flush(); 
     writer.Close();    
     Process p = new Process(); 
     p.StartInfo.FileName = batchFileName;    
     p.StartInfo.UseShellExecute = true;        
     p.Start(); 

批處理文件被寫入併成功執行;但是,命令「manage-bde」無法識別。

我更改了代碼以使用動詞「runas」並使用管理員密碼並且可以工作,但我希望批處理文件無需提供管理員密碼即可工作。當前登錄的用戶已經是計算機上的管理員,但批處理文件沒有以現有的管理員權限執行。我需要批處理文件執行並管理-bde才能成功運行。

您的幫助和建議將非常非常感謝:)

PS:不是,而不需要管理員的RunAs管理bde做工精細其他一些命令。

+0

'我使用的代碼來自:MS網站上的UAC自升級示例,用於確認應用程序進程已被提升,如果是這種情況涉及到重要的代碼,包括對Native Windows API的調用。您是否完全實施瞭解決方案?它也在使用Windows Identity Framework。再一次,你是否完全實施了這個例子中的解決方案? –

+0

我添加了NativeMethods.cs並從該示例中複製了相關函數「IsElevated」;該函數返回true。我用這只是爲了確認在運行批處理文件過程 – mymo

+0

時使用用戶名和密碼調用「RunAs」導致process.start調用本地方法(CreateProcessWithLogonW)時我的進程處於高級別。這會創建一個新的安全上下文並從中運行應用程序(在這種情況下爲manage-bde)。這個新的安全上下文是一個64位的上下文,它在訪問system32時不會被重定向。 如果我不使用用戶名和密碼,則調用的本地方法將是:(CreateProcess)。這將在調用應用程序的相同安全上下文中啓動新的進程(在我上面的例子中,這是一個32位上下文)。結果訪問被重定向到syswow64並且沒有找到該文件。 – mymo

回答

0

我遇到的行爲的原因是Windows文件系統重定向器。

在大多數情況下,當一個32位應用程序試圖訪問%WINDIR%\ System32下,訪問被重定向到%WINDIR%\ Syswow64資料

https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx

我的應用程序的構建是32位。每當它試圖訪問System32窗口時,都會自動將其重定向到不包含「manage-bde.exe」的SysWow64。我將版本更改爲64位,然後應用程序可以從System32訪問manage-bde.exe

0

即使您以管理員用戶身份運行,如果UAC正在運行,您也沒有完全升級。這意味着您將有UAC提示出現,否則系統會提示您輸入密碼。

您唯一可以解決的方法是首先運行您的應用程序,或者編寫一個以提升的權限運行的服務來啓動您的新進程。

當然的選擇是禁用UAC,但在大多數情況下這是不可取的。

+0

OP特別聲明'但我希望批處理文件不需要提供管理員密碼就可以使這個解決方案完全失效。 –

+0

@MichaelPerrenoud沒有注意到,謝謝指出。我已經更新了我的答案。 – PhonicUK

+0

@ PhonicUK感謝您的回覆。我開始進程(Process.Start())的時候,我的調用進程被提升了。我確認通過調用上面提到的代碼中的IsElevated。如果我提供runas動詞,它只能成功運行,並通過進程startInfo輸入管理員用戶名和密碼 – mymo

相關問題