powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Выключение компьютера. System.Diagnostics.Process()
14 сообщений из 14, страница 1 из 1
Выключение компьютера. System.Diagnostics.Process()
    #38157771
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня этот код работает не так как я ожидаю.
Я ожидаю что после нажатия кнопки компьютер выключится.
А в результате: cmd вызывается, ничего(выключения) не происходит, + вызывается еще одна форма(окно) Form1.
В чем ошибка? Про что я мог забыть? В чем глюк?
Может я параметр не так передаю?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace shutdown
{
  public partial class Form1 : Form
  {

    public Form1()
    {
      InitializeComponent();

    }

    private void button1_Click(object sender, EventArgs e)
    {
      System.Diagnostics.Process p = new System.Diagnostics.Process();
      p.StartInfo.FileName = "cmd.exe";
      p.StartInfo.Arguments = "/c shutdown -s";
      p.Start();
    }

  }
}
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158392
sld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sld
Гость
Код: sql
1.
cmd.exe /c shutdown -s


а просто вызвать то завершает? а там не "/s"?
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158609
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sld
Код: sql
1.
cmd.exe /c shutdown -s


а просто вызвать то завершает? а там не "/s"?
Да, если это запустить через Пуск -> Выполнить... - то все прекрасно выключается.
Почему же не работает из программы(формы)?
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158679
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте ключ force
возможно компьютер не выключается, потому что ожидает завершение вашей программы, а ваша программа ожидает завершения shutdown. А вообще есть же вроде API функция для выключения
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158680
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можа не находит shutdown... посмотрите ошибки... cmd - избыточен... Вколотите полный путь до shutdown.exe
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      System.Diagnostics.Process p = new System.Diagnostics.Process();
      p.StartInfo.FileName = "shutdown.exe";
      p.StartInfo.Arguments = "-s";
      p.StartInfo.CreateNoWindow = true;
      p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      p.StartInfo.RedirectStandardOutput = true;
      p.StartInfo.RedirectStandardError = true;
      p.Start();
      string out_msg = p.StandardOutput.ReadToEnd();
      string err_msg = p.StandardError.ReadToEnd();
      p.WaitForExit();

}



И вообще - хреновый (не самый лучший) это способ... Почему из всех велосипедов Вы выбрали именно с квадратными колесами?
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158759
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesпопробуйте ключ force
возможно компьютер не выключается, потому что ожидает завершение вашей программы, а ваша программа ожидает завершения shutdown. А вообще есть же вроде API функция для выключения
Попробовал - тот же эффект что и без него, не работает.
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158774
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal,

http://stackoverflow.com/questions/102567/how-to-shutdown-the-computer-from-c-sharp

вот же метод через WMI
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
    using System.Management;

    void Shutdown()
    {
        ManagementBaseObject mboShutdown = null;
        ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
        mcWin32.Get();

        // You can't shutdown without security privileges
        mcWin32.Scope.Options.EnablePrivileges = true;
        ManagementBaseObject mboShutdownParams =
                 mcWin32.GetMethodParameters("Win32Shutdown");

        // Flag 1 means we want to shut down the system. Use "2" to reboot.
        mboShutdownParams["Flags"] = "1";
        mboShutdownParams["Reserved"] = "0";
        foreach (ManagementObject manObj in mcWin32.GetInstances())
        {
            mboShutdown = manObj.InvokeMethod("Win32Shutdown", 
                                           mboShutdownParams, null);
        }
    }


и API
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack=1)]
internal struct TokPriv1Luid
{
    public int Count;
    public long Luid;
    public int Attr;
}

[DllImport("kernel32.dll", ExactSpelling=true) ]
internal static extern IntPtr GetCurrentProcess();

[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool OpenProcessToken( IntPtr h, int acc, ref IntPtr
phtok );

[DllImport("advapi32.dll", SetLastError=true) ]
internal static extern bool LookupPrivilegeValue( string host, string name,
ref long pluid );

[DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool AdjustTokenPrivileges( IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );

[DllImport("user32.dll", ExactSpelling=true, SetLastError=true) ]
internal static extern bool ExitWindowsEx( int flg, int rea );

internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;
internal const int EWX_FORCE = 0x00000004;
internal const int EWX_POWEROFF = 0x00000008;
internal const int EWX_FORCEIFHUNG = 0x00000010;

private void DoExitWin( int flg )
{
    bool ok;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok );
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_ENABLED;
    ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
    ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero );
    ok = ExitWindowsEx( flg, 0 );
    }
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158789
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buserМожа не находит shutdown... посмотрите ошибки... cmd - избыточен... Вколотите полный путь до shutdown.exe
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
      System.Diagnostics.Process p = new System.Diagnostics.Process();
      p.StartInfo.FileName = "shutdown.exe";
      p.StartInfo.Arguments = "-s";
      p.StartInfo.CreateNoWindow = true;
      p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      p.StartInfo.RedirectStandardOutput = true;
      p.StartInfo.RedirectStandardError = true;
      p.Start();
      string out_msg = p.StandardOutput.ReadToEnd();
      string err_msg = p.StandardError.ReadToEnd();
      p.WaitForExit();

}



И вообще - хреновый (не самый лучший) это способ... Почему из всех велосипедов Вы выбрали именно с квадратными колесами?

Попробовал этот код, но во время выполнения вылетает InvalidOperationException и указывает на:
Код: c#
1.
p.Start();


- Для перенаправления потоков ввода/вывода для свойства UseShellExecute объекта Process должно быть задано значение 'false'.

Когда закомментировал строки:
Код: c#
1.
2.
3.
4.
5.
      //p.StartInfo.RedirectStandardOutput = true;
      //p.StartInfo.RedirectStandardError = true;

      //string out_msg = p.StandardOutput.ReadToEnd();
      //string err_msg = p.StandardError.ReadToEnd();


- то InvalidOperationException уже не вылетает, но ситуация похожая как и с cmd - появляется вторая такая же форма и ничего(выключения) не происходит.

А вообще хотелось бы разобраться почему пример с cmd не работает. Например, для того случая, если надо будет какую-то другую команду туда передать, а не shutdown.
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158856
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне вообще не понятно, зачем вы используйте интерпретатор "cmd"
shutdown - это не команда, а программа (утилита), которая находится в папке %windir%\system32\shutdown.exe
то есть вам нужно вызывать именно её и передавать её аргументы. Для её выполнения не нужно использовать cmd.
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38158951
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesмне вообще не понятно, зачем вы используйте интерпретатор "cmd"
shutdown - это не команда, а программа (утилита), которая находится в папке %windir%\system32\shutdown.exe
то есть вам нужно вызывать именно её и передавать её аргументы. Для её выполнения не нужно использовать cmd.
Интерпретатор cmd использую в учебных целях. Для того чтобы научится посылать команды. Но почему-то в моем случае он не работает.
Когда же использую shutdown.exe и передаю ей аргументы - то происходит тот же глюк что и при использовании cmd: появляется(дублируется) такая же форма с кнопкой и выключения не происходит.
Не могу понять в чем дело?
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38159214
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wvetal, похоже на сбой в hands.sys.... В этот раз... даже запустил чтоб проверить... Возможно, есть лишние строчки... Но таки комп потух на раз...
Просто скопируйте в онклик... а то х.з., что Вы там понаписали...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "shutdown.exe";
p.StartInfo.Arguments = "/p";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
p.WaitForExit();


P.S.: в учебных - используйте notepad.exe
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38159461
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
buser,

Делаю как Вы написали, все рано не выключается комп, нажимаю на кнопку и ничего не происходит.
(у меня WinXP).

Вот мой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace shutdown2
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      System.Diagnostics.Process p = new System.Diagnostics.Process();
      p.StartInfo.FileName = "shutdown.exe";
      p.StartInfo.Arguments = "/p";
      p.StartInfo.CreateNoWindow = true;
      p.StartInfo.UseShellExecute = false;
      p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      p.Start();
      p.WaitForExit();
    }
  }
}
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38159550
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.... играйтесь на notepsd'е... XP... х.з....Попробуйте прописать полный путь... на семере для shutdown даже ключи другие...
Попробуйте поиграться с http://technet.microsoft.com/en-us/sysinternals/bb897541 , правда, нет уверенности, что оно заживет на XP
Хотя... странно... говорите работает... Ну и внимательно почитайте что в ексепшене пишется...
...
Рейтинг: 0 / 0
Выключение компьютера. System.Diagnostics.Process()
    #38162069
wvetal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня заработало двумя способами:
Код: c#
1.
System.Diagnostics.Process.Start("ShutDown", "/s");


Код: c#
1.
System.Diagnostics.Process.Start("cmd.exe", "/c shutdown -s");


List of all arguments are as following:-r Shutdown and restart the computer-s Shutdown the computer-t xx Set timeout for shutdown to xx seconds-a Abort a system shutdown-f Forces all windows to close-i Display GUI interface-l Log off
Всем спасибо.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Выключение компьютера. System.Diagnostics.Process()
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]