Класс Process — запуск сторонних приложений в C#

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Одним из способов конфигурации консольного приложения является передача параметров приложения через командную строку. В зависимости от полученных параметров, наше приложение может действовать соответствующим образом, например, проводить предварительные вычисления или же загружать данные из файла, путь к которому был передан в параметрах.

  • Как в C# запустить стороннюю программу
  • Как в C# открыть URL в браузере по умолчанию
  • Как в C# запустить стороннюю программу с параметрами
  • Перенаправление стандартных потоков ввода/вывода внешнего приложения
  • Другие возможности класса Process
  • Итого

Класс Process предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать локальные системные процессы. Этот класс удобно использовать в том случае, если Вам необходимо запустить какой-либо сторонний процесс (приложение) и получить от этого приложения данные.

Рассмотрим несколько примеров работы с классом Process.

Допустим, нам необходимо из своего консольного приложения на C# запустить «Блокнот» (notepad.exe). С классом Process это можно сделать следующим образом:

Вначале мы подключили пространство имен System.Diagnostics в котором содержится класс Process. Затем, приложение ожидает нажатия любой кнопки и запускает новый процесс notepad.exe, используя одну из версий статического метода Start.

Process process = Process.Start(“notepad.exe”);

Как только «Блокнот» будет закрыт, в консоль выведется сообщение о том. что внешний процесс завершил свою работу.

Команда RUNAS – запуск приложения от имени другого пользователя Windows.

RunASЗапуск из командного файла приложений от имени Администратора без запроса UAC.

Формат командной строки RUNAS:

RUNAS /trustlevel:уровень доверия программа

Параметры командной строки:

/noprofile – Не загружать профиль пользователя. Это приводит к более быстрой загрузке приложения, но может стать причиной неправильной работы некоторых приложений.

/profile – Загружать профиль пользователя. Этот параметр установлен по умолчанию.

/env – Использовать текущие параметры среды.

/netonly – Учетные данные предназначены только для удаленного доступа.

/savecred – Использовать учетные данные, сохраненные пользователем. Этот вариант не доступен в выпусках Windows 7 Домашняя или Windows 7 Начальная и будет проигнорирован.

/smartcard – Для указания учетных данных используется смарт-карта.

/showtrustlevels – Отобразить список уровней доверия, которые можно использовать в качестве аргументов параметра /trustlevel.

/trustlevel – Значение “уровень доверия” должно быть перечислено в списке уровней доверия.

программа – Командная строка для EXE. См. примеры ниже.

runas /showtrustlevel – отобразить уровни доверия, существующие в системе. В ответ будет отображаться перечень в виде:

В системе доступны следующие уровни доверия:
0x20000 (Обычный пользователь)

Кроме значения trustlevel равного 0x20000 можно пользоваться значениями 0x10000, соответствующему минимальному набору привилегий и 0x40000, стандартному для данного пользователя набору.
Для просмотра отличий разных уровней доверия можно воспользоваться командой Whoami, выполняя ее в сеансе командного процессора, запускаемого с каждым из уровней trustlevel

runas /trustlevel:0x20000 cmd.exe – запустить командный процессор cmd.exe с использованием уровня доверия, полученного в предыдущем примере.

runas /trustlevel:0x40000 cmd.exe – запустить командный процессор cmd.exe с использованием стандартного уровня доверия.

Примечание: в сеансе командной строки, запущенной с использованием параметра /trustlevel, список привилегий соответствующий каждому уровню доверия можно получить с использованием команды whoami /priv,
а полные сведения об учетной записи – whoami /ALL

Примечание: параметр /profile несовместим с параметром /netonly.

Примечание: параметр /savecred несовместим с параметром /smartcard .

Для запуска приложений от имени администратора с использованием runas.exe необходимо изменить стандартные настройки безопасности системы:

– включить учетную запись Администратора ( по умолчанию, она отключена);

– задать пароль для пользователя Администратор;

Пароли, запоминаемые при использовании утилиты RUNAS.EXE с параметром /savecred можно
изменить или удалить с помощью оснастки управления сохраненными паролями:

При наборе ключевых значений нужно соблюдать регистр символов.

Для управления сохраненными учетными записями в командной строке Windows используется утилита
CMDKEY.EXE

Являясь многопользовательской ОС, Windows 11 позволяет запускать приложения от имени другого пользователя. Это означает, что если у вас более одной учетной записи пользователя, вы можете запустить какое-то приложение под разными учетными данными. Это может быть полезно, когда вам нужно быстро применить некоторые ограничения к приложению или запретить ему доступ к вашим личным данным.

Запуск от имени другого пользователя — это встроенная функция Windows 11, поэтому вам не нужно устанавливать дополнительное программное обеспечение. Помимо запуска обычных приложений (.exe), вы можете использовать его с пакетными файлами (.bat, .cmd) и файлами Windows Installer (.msc или .msi).

Будучи запущенным от имени другого пользователя, приложение, скрипт или установщик будут работать с теми же правами, ограничениями и разрешениями, которые есть у этого пользователя. Они не будут использовать данные учётной записи пользователя, в которой вы в данный момент работаете. Такой подход делает возможным запуск нескольких экземпляров одного и того же приложения, работающих под разными учетными данными на одном рабочем столе.

:/>  Активация Windows через командную строку - Software Empire

Существует четыре способа запустить приложение от имени другого пользователя в Windows 11. Для этого вы можете использовать параметры, доступные в проводнике, на панели задач, в меню «Пуск» и в командной строке.

Чтобы запустить приложение от имени другого пользователя в Windows 11, выполните следующие действия.

  • Откройте проводник (Win + E) и перейдите в папку, содержащую исполняемый файл приложения.
  • Нажмите и удерживайте клавишу Shift на клавиатуре, и щёлкните правой кнопкой мыши исполняемый файл.
  • Кликните “Показать дополнительные параметры”, чтобы открыть расширенное контекстное меню. Клавишу Shift можно отпустить.
  • Нажмите «Запуск от имени другого пользователя» в контекстном меню.
  • Введите имя пользователя и пароль для пользователя, от имени которого вы хотите работать.

Готово. Приложение запустится под предоставленными учетными данными другого пользователя.

Существует еще несколько способов запуска исполняемого файла, скрипта или установщика под разными учетными данными.

  • Щелкните правой кнопкой мыши значок приложения на панели задач. Это может быть закрепленное или запущенное приложение.
  • Нажмите и удерживайте клавишу Shift.
  • Удерживая Shift, щелкните правой кнопкой мыши имя приложения в контекстном меню, чтобы увидеть дополнительные пункты меню.
  • Отпустите клавишу Shift и нажмите «Запуск от имени другого пользователя».

Примечание. Этот метод не работает для Проводника, вне зависимости от того, закреплен ли его значок на панели задач, или же он запущен вданным момент. Команда «Запуск от имени» недоступна для значка Проводника на панели задач в любом случае.

Наконец, Windows 11 включает консольное приложение «runas», которое позволяет запускать приложения с использованием разных учетных данных. Вот как его использовать.

Запуск от имени другого пользователя в Windows 11 из командной строки

  • Щелкните правой кнопкой мыши кнопку «Пуск» на панели задач и выберите «Терминал Windows» в контекстном меню.
  • Выберите PowerShell или командную строку, если Терминал открывается в другом профиле.
  • Замените имя пользователя фактическим именем учетной записи пользователя, от имени которого вы хотите работать. Если это учетная запись домена, используйте формат Имя доменаИмя пользователя.

В дополнение к рассмотренным выше методам вы также можете добавить команду «Запуск от имени другого пользователя» в меню «Пуск». Он появится в контекстном меню ярлыков в представлении «Все приложения».

Для этого в Windows 11 есть групповая политика. Вы можете активировать её с помощью тике реестра или в gpedit.msc. Первый вариант работает во всех выпусках Windows 11. Второй доступен только в Windows 10 Pro и выше.

Чтобы включить параметр «Запуск от имени другого пользователя» в меню «Пуск» в Windows 11, выполните следующие действия.

  • Извлеките из него REG файлы в любую папку.
  • Подтвердите приглашение UAC, нажав кнопку «Да».
  • Выйдите из Windows 11 или просто перезагрузите компьютер, чтобы изменения вступили в силу.

Если вы используете Windows 10 Pro или более позднюю версию, вместо этого вы можете использовать редактор локальной групповой политики.

Метод групповой политики

  • Найдите команду “Показать «Запуск от имени другого пользователя» в политике «Пуск»” справа и дважды щелкните ее.
  • Выберите «Включено», чтобы добавить команду «Запуск от имени другого пользователя» в контекстное меню ярлыков в «Пуск».
  • В любое время вы можете выбрать опцию «Не задано» для этой политики, чтобы скрыть команду, как это было по умолчанию.

Готово. Теперь команда доступна для ярлыков меню «Пуск». Вот как использовать запуск от имени другого пользователя из меню «Пуск»

  • Откройте меню «Пуск».
  • Нажмите на кнопку “Все приложения”.
  • Найдите ярлык приложения для своего приложения и щелкните его правой кнопкой мыши.
  • Заполните текстовые поля имени пользователя и пароля и нажмите клавишу Enter.

Наконец, если вы часто используете контекстное меню «Запуск от имени другого пользователя», вас быстро надоест необходимость держать клавишу Shift каждый раз, когда кликаете на меню «Показать дополнительные параметры».

Чтобы сэкономить ваше время, вы можете сделать его всегда видимым в расширенном контекстном меню в разделе «Показать дополнительные параметры».

Примечание: Вы не сможете добавить пункт “Запуск от имени другого пользователя” в стандартное «компактное» контекстное меню. Оно не настраивается. Команда появится только в меню.

  • Справа удалите значение Extended (пустое текстовое значение).
  • Команда «Запуск от имени другого пользователя» теперь всегда будет видна в варианте меню «Показать дополнительные параметры».

Чтобы отменить это изменение, просто заново создайте удаленный параметр “Extended” под соответствующими ключами.

Чтобы автоматизировать этот процесс, вы можете использовать следующие готовые файлы реестра.

Однако иногда вы можете захотеть добиться противоположного эффекта и скрыть команду «Запуск от имени другого пользователя» для всех пользователей. Для этого вам нужно применить немного другой твик реестр. Давайте рассмотрим его для полноты картины.

  • Назовите новое значение “ProgrammaticAccessOnly” и оставьте его значение пустым.
  • Запись «Запуск от имени другого пользователя» теперь удалена для всех пользователей.

Готово. Значение ProgrammaticAccessOnly указывает проводнику скрыть элемент контекстного меню от пользователя, не нарушая работу приложений или Windows. Скрытая команда остается доступной для приложений, если некоторым из них требуется доступ к ней.

:/>  Что необходимо для внедрения стандартов реестров и Axe для работы в беспроводной сети с частотами 2,4 и 5 ГГц — полное руководство по правильному выбору

Чтобы вернуть скрытую команду контекстного меню, просто удалите созданное вами значение ProgrammaticAccessOnly.

Чтобы сэкономить ваше время, я подготовил пару REG-файлов на этот случай.

Вот и все!

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Создание и настройка консольного приложения

Для начала, создадим новое консольное приложение, с которым будем в дальнейшем работать. Запустим Visual Studio (у меня это Visual Studio 2022) и создадим новый проект «Консольное приложение Microsoft»:

Класс Process — запуск сторонних приложений в C#

Консольное приложение C#

Чтобы в дальнейшем наша работ была единообразна, на третьем шаге создания нового проекта обязательно установите флажок напротив опции «Не использовать операторы верхнего уровня»:

Класс Process — запуск сторонних приложений в C#

После того, как вы нажмете кнопку «Создать» должен создаться новый проект с привычным для нас содержимым — классом Program и одним методом — Main:

Так как мы будем в дальнейшем экспериментировать с параметрами нашего приложения, то лучше, чтобы наш проект собирался в папке к которой мы сможем достаточно быстро получить доступ из командной строки, например, в папке «C:Projects». Для этого кликаем правой кнопкой мыши на названии проекта в обозревателе решений и выбираем в контекстном меню пункт «Свойства»

Класс Process — запуск сторонних приложений в C#

Класс Process — запуск сторонних приложений в C#

Базовый путь для выходных данных

Теперь собранный проект будет размещаться в папке «C:ProjectsDebug
et7.0» (если у Вас, как и у меня установлена Visual Studio 2022 и .NET 7). Теперь посмотрим немного более подробно на код нашего приложения.

Как в C# открыть URL в браузере по умолчанию

Для того, чтобы открыть какой-либо URL в браузере по умолчанию достаточно сделать следующий вызов метода Start у класса Process:

using Process process = Process.Start(“explorer”, “https://csharp.webdelphi.ru”);

здесь второй параметр метода — это аргументы командной строки с которыми запускается приложение. И далее, стоит рассмотреть ещё один более сложный пример — запуск приложения с параметрами.

Другие возможности класса Process

Класс Process не зря содержится в пространстве имен System.Diagnostics. Класс Process — это полезное средство не только для запуска, остановки и контроля внешних процессов, но и для их мониторинга.

Класс Process можно использовать для получения списка запущенных процессов.

Класс Process используется для доступа к системным процессам.

После инициализации Process его можно использовать для получения сведений о запущенном процессе. Эти сведения включают в себя набор потоков, загруженные модули (файлы .dll и .exe) и информацию о производительности, например объем памяти, используемой процессом.

Как в C# запустить стороннюю программу с параметрами

В предыдущих примерах мы не использовали ничего, кроме статического метода Start() у класса Process. Однако этот класс позволяет сделать более «тонкую» настройку запускаемого внешнего процесса.

Внешнее консольное приложение для запуска

Для демонстрации следующего примера я написал небольшое консольное приложение которое получает в параметрах два числа, перемножает их и выводит результат в консоль:

Само приложение я поместил в папку c: emp

Запуск стороннего приложения с параметрами

Чтобы запустить в C# стороннее приложение с параметрами мы можем создать экземпляр класс Process и настроить его свойства следующим образом:

После запуска приложения мы увидим в консоли результат вычисления 7х3, то есть число 21. Рассмотрим другие полезные возможности использования класса Process.

Шаблон консольного приложения C# и метод Main

По умолчанию, новое консольное приложение содержит один класс (Program), в котором определен единственный статический метод Main:

При этом, название пространства имен в котором расположен класс Program, совпадает с названием нашего проекта. Что касается названия класса, то, по умолчанию — это Program, однако, если необходимо, то мы можем изменять его как угодно на свое усмотрение, например, назвать его MyProgram или как-то ещё. Что нельзя делать, так это изменять название метода Main или делать его не статическим.

Метод Main — это точка входа приложения C#. С этого метода начинается выполнение программы

Например, если вы попробуете переименовать метод Main во что-нибудь другое, например, MyMain, то при попытке запуска приложения гарантированно получите ошибку следующего вида:

Ошибка CS5001 Программа не содержит статического метода «Main», подходящего для точки входа.

При этом, Вы можете использовать различные сигнатуры метода Main. Допускаются следующие сигнатуры Main:

Например, если я захочу, чтобы в момем методе Main выполнялись какие-то асинхронные задачи, то я могу изменить шаблон своего консольного приложения следующим образом:

Передача параметров в консольное приложение через аргументы командной строки

Допустим, мы хотим, чтобы наше приложение вместо безликого «Hello, World!» здоровалось с нами в зависимости то того, какое имя будет передано приложение через командную строку. Перепишем наше приложение следующим образом:

:/>  Коллекции курсоров - 3 - Custom Cursor

Теперь, если приложение запустится без параметров, то появится стандартная фраза «Hello, World!», иначе — программа будет «здороваться» с каждым, чьё имя будет передано в параметрах.

Соберем наше приложение и проведем тестирование непосредственно из командной строки. Мы договорились, что собираться приложение будет в папке «C:/Projects».

Запускам командную строку (cmd) и выполняем следующие команды:

CD C:ProjectsDebug
et7.0
ИмяПроекта ИмяПользователя1 ИмяПользователя2

Здесь первой командой cd мы переходим в папку приложения. Второй командой мы запускаем приложение и передаем ему параметры. Здесь ИмяПроекта — название вашего проекта, ИмяПользователя1, ИмяПользователя2 — имена пользователей. Например, у меня получился такой вызов:

Класс Process — запуск сторонних приложений в C#

Запуск приложения из командной строки

В результате, мы увидим в консоли следующее:

Hello, Vlad
Hello, Bob
Hello, John

Отладка консольного приложения с параметрами

Каждый раз запускать командную строку Windows для отладки консольного приложения, использующего параметры не удобно. Для того, чтобы запустить приложение в режиме отладки сразу с параметрами можно сделать следующее:

  • Заходим в свойства проекта
  • Переходим на пункт «Отладка» и жмем на ссылку «Открыть пользовательский интерфейс профилей запуска отладки»

Класс Process — запуск сторонних приложений в C#

Открыть пользовательский интерфейс профилей запуска отладки

3. В открывшемся окне в поле «Аргументы командной строки» записываем необходимые нам для откладки параметры через пробел:

Класс Process — запуск сторонних приложений в C#

Теперь можете запустить приложение в режиме отладки и убедиться, что приложение запущено с заданными параметрами:

Класс Process — запуск сторонних приложений в C#

Откладка приложения с параметрами

Определение параметров с пробелами

Параметры (аргументы командной строки) разделяются пробелами. Уже в приложении строка с пробелами разделяется на массив строк. Однако, что делать, если нам необходимо передать значение параметра, которое уже само по себе содержит пробелы? Для этого достаточно заключить такой параметр в двойные кавычки, например:

“Это параметр с пробелами”

В этом случае строка будет интерпретирована как один параметр.

Получение параметров приложения вне метода Main

Если ваше приложение достаточно большое, то, вполне возможно, что Вам потребуется получить аргументы командной строки где-то за пределами метода Main. Сделать это возможно, используя класс Environment. У этого класса определен статический метод GetCommandLineArgs(), который возвращает аргументы командной строки. При этом стоит учесть следующий момент:

Первым элементом массива является имя исполняемого файла. Последующие элементы, если они существуют, содержат аргументы командной строки

Например, вот такой вызов:

приведет к следующему выводу в консоли:

C:ProjectsDebug
et7.0ConsoleParams.dll
Это параметр с пробелами

Вторая строка в консоли — это параметр, который мы определили для приложения в предыдущем примере.

Перенаправление стандартных потоков ввода/вывода внешнего приложения

Про перенаправление потоков ввода-вывода в консольных приложениях C# мы говорили здесь. Класс Process позволяет, при необходимости, перенаправить стандартные потоки ввода-вывода внешнего приложения в свой поток StandardOutput. Рассмотрим как это сделать, используя разработанное приложение для перемножения двух чисел. Наше приложение может не только перемножать числа, но и, при необходимости, выводить в консоль три типа ошибок: когда количество параметров недостаточно и когда один из параметров не является числом. Перепишем пример работы с Process, представленный выше так, чтобы вся информация о работе внешнего приложения выводилась в поток Process.StandardOutput:

Во-первых, мы создали и назначили два обработчика событий:

  • Метод DataReceivedEventHandler — обработчик события при поступлении в поток StandardOutput очередной строки с данными
  • Метод ErrorReceivedEventHandler — обработчик события при возникновении ошибки.

Эти обработчики мы назначили соответствующим событиям класса Process:

process.OutputDataReceived += DataReceivedEventHandler;
process.ErrorDataReceived += ErrorReceivedEventHandler;

Во-вторых, мы перенаправили стандартные потоки выводи и ошибок из внешнего приложения в наше:

process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError= true;

В-третьих, мы запустили операции чтения данных из потока вывода и потока ошибок:

Теперь можно запустить приложение и посмотреть на результат. Результат, когда в качестве аргумента для стороннего приложения задано не число:

Внешний процесс вернул ошибку: Ошибка: в первом параметре содержится не число

Результат, когда заданы верные параметры:

Как можно видеть по результатам, обработчики события работают корректно, что говорит о том, что мы перенаправили стандартные потоки ввода-вывода из внешнего консольного приложения в наше.

Итого

Параметры для консольного приложения могут передаваться через командную строку. Параметры отделяются друг от друга пробелами. Если необходимо передать параметр, содержащий пробелы, то он должен быть заключен в двойные кавычки. Если необходимо получить параметры приложение за пределами метода Main, то можно воспользоваться статическим классом Environment.

Используя класс Process мы можем запускать сторонние приложения из C#, открывать различные документы и ссылки на ресурсы в приложениях по умолчанию, перенаправлять потоки ввода-вывода из внешних приложений в свои, а также, при необходимости, получать различную диагностическую информацию о процессах запущенных в операционной системе.

Оставьте комментарий