Назад | Перейти на главную страницу

Запустить сценарий PowerShell с запуском службы

Я бы хотел установить Affinity и Priority сервисного процесса при его запуске (без изменяя код услуги / процесса, я не владеете кодом, это сторонняя служба).

Я знаю, что могу:

$Process = Get-Process MyService $Process.ProcessorAffinity = 4

в PowerShell изменить Affinity процесса или префикс пути к команде с:

cmd.exe /c start "Some Process Name" /affinity 4

Тем не мение, ни то, ни другое из них применимы к изменению Affinity и Priority процесса обслуживания автоматически каждый раз сервис запущен) Как это сделать без используя какое-то стороннее приложение, которое `` поддерживает '' сходство процессов при перезапуске (я бы действительно люблю писать / создавать решение самостоятельно и не полагаться на еще одно приложение для «настройки» окон).

Взгляните на этот пост: http://waynes-world-it.blogspot.ca/2009/06/processor-affinity-on-windows-server.html

Если вы пытаетесь управлять службой, вы можете использовать instsrv / srvany для создания службы, которая обертывает команду start или psexec вокруг реального двоичного файла службы. Например, приведенные ниже команды создают другую версию службы диспетчера очереди печати, которая будет работать только на первом процессоре.

instsrv Test c:\util\srvany.exe 
reg add hklm\system\currentcontrolset\services\test\Parameters
reg add hklm\system\currentcontrolset\services\test\Parameters /v Application /t reg_sz /d cmd.exe 
reg add hklm\system\currentcontrolset\services\test\Parameters /v AppParameters /t reg_sz /d "/c start /affinity 1 C:\WINDOWS\system32\spoolsv.exe"

Хорошо, я построил комментарий @ Art.Vandelay05, и вот (ИМХО большинство интуитивно понятный) решение.

  1. Создать Script.ps1 Сценарий PowerShell со следующими строками:

    $Process = Get-Process <service_process_exe_name_WITHOUT_the_exe>
    $Process.ProcessorAffinity = <шестнадцатеричная версия битового кода для соответствия процессору>
  2. Перейти к Administrative Tools/Task Scheduler и Create Task... (НЕ Create Basic Task)
  3. Вкладка Общие
    • Установите флажок Выполнить, вошел ли пользователь в систему или нет
    • Сменить пользователя или группу локальному пользователю на вашем компьютере
  4. Триггеры
    • Новый ...
    • Включено
    • Начать задачу На мероприятии
    • Изменить фильтр событий
    • Используйте немного XSLT чтобы найти сообщение для запуска вашей службы. Я использовал:

<QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[EventData[Data[@Name="param1"] and (Data="<your_service_name> ")]] and *[EventData[Data[@Name="param2"] and (Data="running")]] </Select> </Query> </QueryList>

  1. Действия
    • Действие Запустить программу
    • Программа / сценарий: PowerShell.exe
    • Добавьте аргументы (необязательно): -Файл "путь_к_скрипту \ Script.ps1"

Это оно! Теперь каждый раз, когда ваша служба запускается, привязка будет устанавливаться в соответствии с написанным вами сценарием PowerShell.

Редактировать: Делать конечно у вашего локального пользователя есть Debug Programs право (Администрирование / Локальная политика безопасности / Назначение прав пользователей / Отладка программ / добавьте в это право вашего локального пользователя) или вашего пользователя не будет иметь возможность изменять привязку процесса.