2017-01-31 10 views
1

Целью является возможность протестировать сценарий PowerShell без интерактивного взаимодействия с минимальной церемонией. Он намеренно запускается по-разному на сервере CI, чем при запуске в интерактивном режиме, и я бы хотел его отладить. В идеале я мог бы проверить это, не настраивая запланированную задачу. Утилита командной строки была бы фантастической.Как запустить неинтерактивный процесс с интерактивного сеанса

Различия между CI-сервером (сборка TFS, неинтерактивная) и моей машиной (работает в интерактивном режиме) - это значение [Environment]::UserInteractive. Когда я набираю powershell -c [Environment]::UserInteractive в командной строке, я получаю True, как и ожидалось. Цель состоит в том, чтобы иметь возможность набирать someutility powershell -c [Environment]::UserInteractive и распечатывать его False, так же как и печать под управлением TFS.

Я хочу написать someutility на C++, если кто-то может описать, как это работает. Я исследую, но час ничего не принес. Все уже работают не интерактивно или хотят запускать интерактивные, и я вхожу в точный обратный сценарий. Кажется, что должен быть способ сделать это из командной строки, отличной от администратора, поскольку запущенный процесс должен иметь одинаковые права пользователя, но быть ограничен неинтерактивным.

До сих пор я мог получить это желаемое [Environment]::UserInteractive = ложное поведение с использованием запланированной задачи и выбор «Запустить, включен ли пользователь или нет». Но это боль, и я не вижу, что неинтерактивный stdout, который я знаю, возможен, потому что сборка TFS показывает это вживую. Кроме того, запланированная задача не заканчивается, когда выполняется не интерактивно, поэтому трудно сказать, когда это будет сделано.

ответ

1

The reference code for UserInteractive can be found here. Он устанавливает значение false в том и только в том случае, если на оконной станции процесса нет установленного флага WSF_VISIBLE. Поэтому ваша утилита должна создать новую оконную станцию ​​и рабочий стол (см. CreateWindowStation и CreateDesktop) и запустить там дочерний процесс.

(Только оконная станция по умолчанию для любого данного сеанса является интерактивной, поэтому предположительно созданные вручную станции окна не будут установлены по умолчанию WSF_VISIBLE. Если это не так, вы должны иметь возможность использовать SetUserObjectInformation для переключить флаг.)

Чтобы выбрать окно станции и рабочий стол для дочернего процесса, укажите его в lpDesktop член STARTUPINFO структуры в вызове CreateProcess.

+0

Это потрясающе! У меня есть доказательство работы! – jnm2

 Смежные вопросы

  • Нет связанных вопросов^_^