我需要從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做工精細其他一些命令。
'我使用的代碼來自:MS網站上的UAC自升級示例,用於確認應用程序進程已被提升,如果是這種情況涉及到重要的代碼,包括對Native Windows API的調用。您是否完全實施瞭解決方案?它也在使用Windows Identity Framework。再一次,你是否完全實施了這個例子中的解決方案? –
我添加了NativeMethods.cs並從該示例中複製了相關函數「IsElevated」;該函數返回true。我用這只是爲了確認在運行批處理文件過程 – mymo
時使用用戶名和密碼調用「RunAs」導致process.start調用本地方法(CreateProcessWithLogonW)時我的進程處於高級別。這會創建一個新的安全上下文並從中運行應用程序(在這種情況下爲manage-bde)。這個新的安全上下文是一個64位的上下文,它在訪問system32時不會被重定向。 如果我不使用用戶名和密碼,則調用的本地方法將是:(CreateProcess)。這將在調用應用程序的相同安全上下文中啓動新的進程(在我上面的例子中,這是一個32位上下文)。結果訪問被重定向到syswow64並且沒有找到該文件。 – mymo