Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#关闭,Process.Start(“关机”)在Windows XP中不工作_C#_.net_Windows_Process.start - Fatal编程技术网

如何从C#关闭,Process.Start(“关机”)在Windows XP中不工作

如何从C#关闭,Process.Start(“关机”)在Windows XP中不工作,c#,.net,windows,process.start,C#,.net,Windows,Process.start,在仔细研究了如何重置计算机和/或从C#关闭计算机之后,我发现了关于如何执行此操作的以下解释: ManagementBaseObject outParameters = null; ManagementClass sysOS = new ManagementClass("Win32_OperatingSystem"); sysOS.Get(); // Enables required security privilege. sysOS.Scope.Options.EnablePrivileges

在仔细研究了如何重置计算机和/或从C#关闭计算机之后,我发现了关于如何执行此操作的以下解释:

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);
}
这在Windows7中有效,但在我试用过的WindowsXP框中无效。所以我想,让我们用一个更简单的解决方案:

Process.Start("shutdown", "/s /t 00");
唉,这似乎也适用于我的Windows7设备,但不适用于我的WindowsXP设备。我只在一台WindowsXP机器上试用过它,但它会像命令提示符一样闪烁,我启动的程序会最小化到系统托盘,然后什么也没发生。所以它好像想做什么,但最终什么也没发生。(我确实有代码在点击关闭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();
    }
}
private void main form\u FormClosing(对象发送方,FormClosingEventArgs e)
{
如果(!canExit)
{
e、 取消=真;
this.WindowState=FormWindowState.Minimized;
}
其他的
{
//写出日志。
List logs=LogUtil.getLog();//mic.getLog();
//创建一个编写器并打开文件
TextWriter tw=新的StreamWriter(userAppData+“\\logTMC.txt”,true);
//在文件中写入一行文本
tw.WriteLine(“----”+DateTime.Now+“----”);
foreach(日志中的字符串日志)
{
tw.WriteLine(日志);
}
//关闭小溪
tw.Close();
}
}
我不知道为什么我可以在Windows7中,但在WindowsXP上,从C#重置并关闭我的电脑…也许我错过了什么?额外的命令?关闭窗体关闭时打开的日志文件的更好方法?不管怎样,我使用的WindowsXP框确实有一个SVN服务器作为windows服务在运行,但我不确定这是否有什么不同


所以我真的不确定在哪里调查我的问题。
Process.Start()
是否有办法查看退货或try-catch,以了解是什么原因导致它没有关闭,还是“打火就忘了”类型的交易?

我还不能添加评论,因此必须将其作为答案发布

本网站上有一篇文章介绍了关闭电脑的几种方法:


我在上面的链接中一眼就注意到,对于XP,Pop Catalin使用
Process.Start(“shutdown”,“s/t0”)。我不确定使用1
0
是否会产生任何影响。

您可以通过pinvoke.net使用
ExitWindowsEx
API

有关更多信息,请参阅pinvoke.net上的、和。请注意,您的流程必须获得
SE_SHUTDOWN_NAME
权限(例如通过API)

答案中包含一些“完整”的示例(尽管大多数示例都缺少错误检查和资源清理—后者在您成功关机时可能无关紧要,YMMV)


最后,请注意,从安全角度来看,如您所示,使用
Process.Start()
而不使用
shutdown.exe
的完全限定名也是有问题的。有人可能在您的路径中放置名为shutdown的恶意EXE。由于您可能需要使用管理员权限运行才能执行“real”shutdown.exe,这可能会导致一些问题。如果您指定类似于
Process.Start(Environment.ExpandEnvironmentVariables(“%windir%\system32\shutdown.exe”)
的内容,您至少可以假设真正的shutdown.exe受到文件系统权限的保护,不会被恶意替换(如果攻击者本身是管理员,那么您基本上已经被抓获)。

我相信这是正确的。您只需将命令更改为:

shutdown.exe -s -t 00

它可以在我的Windows设备上运行(从cmd)。

如果在XP设备上的命令提示符下运行“shutdown/s/t 00”会发生什么情况?你的问题不应该是“如何从代码中关闭”?可能是重复的,我可以用一个零来尝试它。进程启动的要点很好。我确实按照另一个xp框上的一条评论建议尝试了关闭命令,它确实关闭得很好。。。不在常规xp框中。我会试试ExitWindowsEx,看看是否更安全更有力。。。要到今晚才能尝试:(