2010-09-16 52 views
3

經過一番探討如何重置我的電腦或關閉它從C#我發現這個解釋如何做到這一點:如何關閉從C#,Process.Start(「關機」)不能在Windows XP中工作

ManagementBaseObject outParameters = null; 
ManagementClass sysOS = new ManagementClass("Win32_OperatingSystem"); 
sysOS.Get(); 

// Enables required security privilege. 
sysOS.Scope.Options.EnablePrivileges = true; 

// Get our in parameters 
ManagementBaseObject inParameters = sysOS.GetMethodParameters("Win32Shutdown"); 

// Pass the flag of 0 = System Shutdown 
inParameters["Flags"] = "1"; //shut down. 
inParameters["Reserved"] = "0"; 
foreach (ManagementObject manObj in sysOS.GetInstances()) 
{ 
    outParameters = manObj.InvokeMethod("Win32Shutdown", inParameters, null); 
} 

這個工作在Windows 7  ,但不能在Windows XP  我框試了一下上。所以我也讓去一個簡單的解決方案:

Process.Start("shutdown", "/s /t 00"); 

哀哉,也似乎在我的Windows 7盒工作,但不是我的Windows XP  箱。我只在一臺Windows XP上運行它,但它像命令提示符一樣閃爍,我的程序啓動最小化到系統托盤,然後什麼也沒有發生..所以它想要做一些事情,但最終什麼也沒有發生。 (我確實有代碼故意將我的程序放到sys托盤中,當關閉X被擊中,並且用戶必須故意退出它...)是否有問題呢?我的FormClosing代碼是這樣的:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (!canExit) 
    { 
     e.Cancel = true; 
     this.WindowState = FormWindowState.Minimized; 
    } 
    else 
    { 
     // Write out the logs. 
     List<String> logs = LogUtil.getLog(); // mic.getLog(); 

     // Create a writer and open the file 
     TextWriter tw = new StreamWriter(userAppData + "\\logTMC.txt", true); 

     // Write a line of text to the file 
     tw.WriteLine("----- " + DateTime.Now + " ------"); 
     foreach (String log in logs) 
     { 
      tw.WriteLine(log); 
     } 

     // Close the stream 
     tw.Close(); 
    } 
} 

我不知道爲什麼我可以重置,並從C#關機我的電腦在Windows 7  ,但不能在Windows XP   ...也許我錯過了什麼?額外的命令?關閉表單關閉時打開的日誌文件的更好方法是什麼?無論如何強制關機或重置的一些方法,我使用的Windows   XP框確實有一個SVN服務器作爲正在運行的Windows服務,但我不確定這是否有所作爲。

所以我不確定在哪裏調查我的問題。 Process.Start()是否有辦法查看退貨或嘗試追蹤以查看導致其不關閉的原因,或者它是一種「隨意忘記」類型的交易?

+1

如果從XP機器上的命令提示符運行「shutdown/s/t 00」,會發生什麼情況? – 2010-09-16 07:48:25

+1

你的問題不應該是'如何關閉代碼'? – 2010-09-16 08:17:51

+0

可能的[如何從C#關閉計算機]的重複(http://stackoverflow.com/questions/102567/how-to-shutdown-the-computer-from-c-sharp) – Joshua 2016-09-05 15:29:15

回答

1

我無法添加評論,所以必須將其作爲答案發布。

有本網站的文章,顯示在這裏關閉PC的幾種方法:How to shut down the computer from C#

我一眼在上面的鏈接注意到,對於XP,流行克特林使用Process.Start("shutdown","/s /t 0");。我不確定使用1 0是否會有所作爲。

+0

我可以嘗試一個零。 – Codejoy 2010-09-16 14:13:38

3

您可以通過pinvoke.net使用ExitWindowsEx API。

有關更多信息,請參見pinvoke.net上的ExitWindowsExExitWindows-EnumShutdownReason-Enum。請注意,您的流程必須具有SE_SHUTDOWN_NAME權限(例如,通過AdjustTokenPrivileges API)。

this stackoverflow question的答案包含一些「完整的」示例(儘管其中大部分都缺少錯誤檢查和資源清理 - 當成功關閉YMMV時,後者可能無關緊要)。

最後,請注意使用Process.Start()爲您呈現,沒有一個完全合格的名稱shutdown.exe也是從安全角度來看問題。有人可能會在PATH中放入一個名爲shutdown的惡意EXE。由於您可能需要使用管理員權限運行才能執行「真正的」shutdown.exe,因此可能會造成一些麻煩。如果你指定了類似Process.Start(Environment.ExpandEnvironmentVariables("%windir%\system32\shutdown.exe"))的東西,那麼你至少可以假設真正的shutdown.exe不受文件系統權限的惡意替換(如果攻擊者本人是一個管理員,那麼你基本上都會被破壞)。

+0

流程開始的好點。我確實嘗試了關於另一個XP盒上的評論建議之一的關機命令,它確實關閉了很好......不是在常規的XP盒子上。我會嘗試ExitWindowsEx,看看這是否更安全,更有力...直到今晚纔會受到刺傷:( – Codejoy 2010-09-16 16:09:22

0

我相信這是正確的。你只需要在命令更改爲:

shutdown.exe -s -t 00 

它可以在我的Windows機器(從CMD)。