Интерактивная сессия 0 в Windows 7

14

Я пытаюсь запустить cmd.exe в сеансе 0. До сих пор я сделал следующее из командной строки с повышенными правами:

sc config UI0Detect start= auto
net start UI0Detect

И ответ указывает, что служба была запущена правильно. Именно в этот момент я предположил, что если я переключусь на сессию 0, cmd.exe будет запущен.

Я переключаюсь на сессию 0, используя следующую команду:

rundll32 winsta.dll,WinStationSwitchToServicesSession

Это успешно переключает меня на сеанс 0, но единственное доступное окно - это окно, которое имеет возможность вернуться к сеансу 1.

Как мне получить cmd.exe для запуска в сеансе 0?

omghai2u
источник
Почему вы хотите это сделать? UI0Detect позволяет старым сервисам всплывать в окне сообщений, не запуская новые приложения с графическим интерфейсом. cmd.exe имеет графический интерфейс
Питер Хандорф
6
@PeterHahndorf Я понимаю, что интересно отклонять ответы на вопросы, говоря: «Давайте сделаем шаг назад и посмотрим, действительно ли это то, что нам действительно нужно сделать, потому что это звучит как плохая идея», и это относительно хороший способ порицать коллег-разработчиков. Но так как это для сценария отладки и должно быть быстрым исправлением (и альтернативой использованию какого-либо стороннего приложения, такого как AlwaysUp), я не очень понимаю, почему вопрос «почему» является полезным ответом. Спасибо, в любом случае.
omghai2u
Я думаю, у Питера есть смысл. Вопрос, который вы должны были написать: «Это то, что я пытаюсь сделать». Быстрое решение будет включать только боль в будущем. Я не могу сосчитать, сколько раз я слышал «быстрое исправление», только чтобы увидеть «быстрое исправление» в производстве три года спустя. , , нуждающийся в другом "быстром решении". Я предполагаю, что вы печатаете, чтобы запустить какой-то пакетный скрипт?
Surfasb
1
@surfasb Вопрос, который вы предложили, по сути является вопросом, который я написал: «Я пытаюсь запустить cmd.exe в сеансе 0». Пожалуйста, держите ответы на этом вопросе. Благодарю. И нет никаких шансов, что это попадет в производство, или для того, чтобы вовлечь будущую боль. Способ, которым я делаю это для производства, уже установлен, но я не могу использовать его для отладки. То, как я сейчас это делаю для отладки, обременительно и требует использования стороннего приложения.
omghai2u

Ответы:

19

Чтобы запустить cmd.exe в сеансе 0, используйте psexec от Sysinternals

psexec.exe -s 0 cmd.exe

Теперь у вас есть консоль, запущенная в сеансе 0,

Вы также можете запустить cmd.exe в сеансе 0 и отобразить графический интерфейс:

psexec.exe -s -i 0 cmd.exe

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

у вас есть столько прав, сколько вы можете получить в Windows 7:

whoami /all

если вы используете другие PsTools, не забудьте использовать ключ / accepteula:

pslist /accepteula

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

Чтобы убедиться, что вы работаете в сеансе 0, вы можете использовать qprocess:

qprocess /ID:0

вы увидите ваш cmd.exe среди всех сервисных процессов.

Питер Хандорф
источник
Огромное спасибо за попытку ответить на мой вопрос. Это определенно сработало бы, мое конкретное намерение (как указано в комментариях), однако, было избегать использования сторонних приложений. Есть ли хороший способ сделать это, который не требует использования инструментов SysInternals (или чего-то такого, чего нет в Windows)? Еще раз спасибо.
omghai2u
2
Я не считаю Sysinternal tools «сторонними», они от Microsoft, и вам не нужно их устанавливать.
Питер Хандорф
Извините, я рассматривал что-то не установленное по умолчанию "сторонний".
omghai2u
Питер. Здорово, спасибо. Прекрасно работает для запуска процесса в сеансе 0 (что означает, что он продолжает работать, когда вы выходите из системы.)
Даниэль Джеймс Брайарс
5
Первая командная строка неверна: -sзапускается от имени SYSTEMпользователя и не принимает аргументов. Возможно, вы имели -i 0в виду в первом примере и -s -i 0во втором?
JWG
1

Это не сработает. Это просто запускает процесс как система.

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

У MS есть утилита, которая позволяет запускать программу как сервис. Он называется Srvanyи находится в Windows 2003 Resource Kit Tools.

Скачать Windows Server 2003 Resource Kit Tools

Дэвид
источник
0

Однажды я обнаружил решение случайно, но http://www.alex-ionescu.com/?p=59 также документирует решение, близкое к тому, что я нашел

Создайте командный файл со следующим (назовите его some.bat)

start cmd

Затем создайте службу для вызова этого пакетного файла (используя командную строку администратора)

sc create access0 type= interact type= own binpath= some.bat

(Обратите внимание на пробел после каждого =, и я предлагаю использовать полный путь для some.bat)

Тогда это вопрос запуска услуг

sc start ui0detect
sc start access0

(Нет необходимости делать автоматический запуск ui0detect с помощью sc config UI0Detect start = auto)

И если все пойдет хорошо, вы получите мигающую коробку с неизбежными сообщениями! Перейдите к разделу «Просмотр сообщений», и вы получите командную строку Admininstrator (nt полномочия \ система), которая не будет автоматически уничтожена при неудачном запуске службы (следовательно, необходим пакетный файл с командой start)

Это работает, хотя иногда это не работает с первой попытки.

Я считаю, что это дает вам доступ только к интерактивному сеансу 0, который существует только для пользователя nt полномочия \ system

Энди
источник
-2

Вы можете использовать сочетание клавиш «Пуск» (Windows) + R, чтобы запустить диалоговое окно «Выполнить». Оттуда просто введите «cmd» (без кавычек) и вуаля. CMD

Y2Forever
источник
3
Добро пожаловать в SuperUser. Ваш пост не отвечает на вопрос ОП. Начиная CMDнормально не ставит один в Session 0.
Я говорю Восстановить Монику