Рейтинг:
26
Dave Kreskowiak
Что ты делаешь не так? Вы пытаетесь создать интерактивный процесс из сервиса. Не очень хорошая идея, так как что делать, если в это время никто не вошел в систему? Что делать, если в машину одновременно вошло несколько человек?
Вы можете перейти на вкладку "Свойства службы", " вход в систему "и включить" разрешить службе взаимодействовать с рабочим столом", но это не будет делать то, что вы ожидаете от нее в Windows 7 и выше.
То, что вы хотите сделать, очень сильно не поощряется Microsoft, в основном по соображениям безопасности.
kenstern
Дэйв, да-я знаю. К сожалению, у меня есть некоторые довольно уникальные требования. На самом деле я портирую это с Win XP (где это работает просто отлично) на Win 7. Кроме того, Microsoft и мой вывод из множества поисков заключается в том, что это "рекомендуемый" способ делать то, что я хочу. Обратите внимание, что там будет пользователь, вошедший в систему (мы делаем это непосредственно перед вызовом CreateProcessAsUser), и мы используем токен, возвращенный из этого входа в систему, чтобы идентифицировать пользователя/сеанс. Так... понимая, что это немного закулисный способ делать вещи ... почему это не работает?
Dave Kreskowiak
Теперь вы знаете, почему Microsoft говорит, что не делайте этого. Функциональность была отгорожена стеной в 7. Вы не можете создать интерактивный процесс на рабочем столе пользователя из сеанса 0 по соображениям безопасности. Все, что делает ваша служба, требующая взаимодействия с пользователем, будет ограничено отображением на альтернативном рабочем столе. Пользователь, самое большее, получит уведомление о том, что служба хочет вашего внимания, и даст вам возможность переключить рабочий стол службы, чтобы увидеть, что происходит. Это называется "изоляция сеанса 0".
Раньше, до 7 (возможно, Vista), службы запускались в том же сеансе, что и первый пользователь, вошедший в консоль, сеанс 0. Поскольку службы обычно работают с повышенными привилегиями, вредоносная служба могла показывать пользовательский интерфейс пользователю в том же сеансе. Отсюда и рост изоляции сеанса 0.
S0I был разработан для защиты пользователей от потенциально плохих процессов обслуживания и драйверов, а также наоборот, для защиты законных сервисов от потенциально опасных пользовательских приложений.
Ранее ваш код работал только потому, что службы и пользовательские приложения могли работать в одном сеансе под разными станциями. Это больше не происходит в возрасте до 7 лет. Даже службы, помеченные как "разрешить интерактивный", застряли в сеансе 0, полностью изолированном от сеанса 1 и выше.
Вы можете создавать новые процессы, указывая оконную станцию и рабочий стол для запуска процесса, но вы не можете указать сеанс для запуска. Даже если идентификаторы станции и рабочего стола идентичны, каждый сеанс поддерживает свою собственную таблицу станций и рабочих столов.
Хммм... Передаете ли вы маркер безопасности пользователей CreateProcess??
Dave Kreskowiak
Вы не можете изменить, в каком сеансе создается процесс, но вы можете изменить идентификатор сеанса для маркера безопасности. (BIG) если служба имеет привилегию "действовать как часть операционной системы", она может изменить копию маркера безопасности в соответствии с идентификатором сеанса вошедших пользователей. Затем вы можете передать измененный токен CreateProcessAsUser.
..- во всяком случае, теоретически. Я понятия не имею, будет ли это работать или что еще нужно сделать, чтобы пользователь увидел этот процесс.
fjdiewornncalwe
Абсолютно. Для того чтобы приложение" пользователь "выполнялось из службы, необходимо выбрать опцию" Разрешить взаимодействовать...". К счастью, у меня были другие варианты, а не реализация этого на Win7/2008.
Dave Kreskowiak
Да, единственная проблема с этим заключается в том, что он все равно интерактивный, просто не на станции окна пользователя. Под 7 служба будет работать под WinSta0, но другой WinSta0, чем видит пользователь. Служба WinSta0 все еще застряла в сеансе 0, который пользователь не увидит.
kenstern
Ладно , я понял. Похоже, мне просто придется найти другой способ сделать это, и это потребует некоторых изменений в требованиях. В принципе, с переходом на Windows 7 "Вы больше не можете попасть туда отсюда". Спасибо!!
Felice Pollano
Предложение "разрешить службе взаимодействовать с рабочим столом" является** неправильным**, так как в Win7 /2k8 server и новее эта проверка не изменяет сеанс, на котором выполняется процесс.
Dave Kreskowiak
МММ...почему вы отвечаете на сообщение полуторагодичной давности, которое тщательно обсуждалось и о котором вы действительно не добавляете никакой новой информации??
Felice Pollano
Я видел этот вопрос помеченным как ответ, потому что у меня та же проблема. Поскольку ответ подписан как ответ, но не является ответом, я думаю, что лучше знать об этом всем, кто читает эту тему.
ahamednafeel
Пожалуйста, укажите, есть ли другие способы преодолеть winsta0 с windows xp до windows 7??
Dave Kreskowiak
Вы ведь не читали всю эту тему, не так ли?
В последний раз повторяю: нет, нет никакого способа создать пользовательский интерфейс или запустить процесс на рабочем столе пользователя из службы WINDOWS! ЭТА СПОСОБНОСТЬ БЫЛА УДАЛЕНА ИЗ WINDOWS, ПОСКОЛЬКУ ОНА БЫЛА ОПРЕДЕЛЕНА КАК УГРОЗА БЕЗОПАСНОСТИ.
ahamednafeel
Спасибо, Дэйв...
У меня есть приложение, которое работает на windows xp.. Но не на Windows 7 по причине сеанса 0.. Я понял, что произошло.. Но для этого мне нужно решение.- Я должен позвонить в это приложение..
Dave Kreskowiak
У вас нет другого выбора, кроме как отказаться от того, что у вас есть, и переписать так, чтобы ваш сервис не пытался что-либо сделать со станцией пользователей. Это просто никогда не сработает.
У вас должно быть отдельное приложение, которое работает на рабочем столе пользователя и принимает команды от службы по какому-то IPC-каналу, например по именованному каналу. Это второе приложение может делать все, что вы хотите, например запускать другие приложения, потому что оно работает как пользователь и на рабочем столе пользователя.
ftosteve
@Дейв. Один недостаток в "правильном пути". Для взаимодействия с рабочим столом необходимо запустить клиентское приложение. Если кто-то закрывает клиент, то ваш сервис больше не может что-то сказать пользователю. И поскольку служба не может перезапустить клиент (s0i), вы застряли.
Все, кажется, предполагают, что желаемый контроль-это клиент для обслуживания там, где я хочу обслуживания клиента.
Я хотел бы, чтобы служба открывалась с рабочего стола клиентов независимо от того, работают ли они в трее/клиенте/приложении и т. д.
Затем попросите их ответить на некоторые вопросы, чтобы продолжить обработку.
У меня также есть проблема, когда я хочу, чтобы общая служба работала в нескольких средах.
1. с оболочкой(explorer.exe) показ рабочего стола. Значок в трее существует, и запускаются автозапуски/стартапы, но userr может закрыть клиентское приложение, остановив команды ipc из службы.
2. с заказной оболочкой нет рабочего стола/лотка/автозапуска/стартапов, поэтому клиентское приложение не может быть запущено в ipc к сервису.
Между прочим. Утверждение о том, что невозможно запустить клиентское видимое приложение в сеансе 1 из службы в сеансе 0, является своего рода ложью.
Microsoft сами это делают. Вас вы видите в действии хотя бы раз в месяц...
Обслуживание SVCHOST.EXE в сеансе 0 запускается клиентское видимое приложение/лоток WUAUCLT.EXE в сеансе 1 (ваш вход в систему).
Dave Kreskowiak
На самом деле, это не ложь.
Да, SVCHOST делает это только потому, что это внутреннее приложение Windows, которое вообще не имеет никакой документации. Ваша служба не может использовать его.
Ваш сервис по-прежнему не может открыть пользовательский интерфейс на рабочем столе пользователя. Период. Конец истории. Попытка заставить его сделать это только делает ваш код, возможно, несовместимым с будущими окнами, то есть с WinXP до Vista и выше.
Удачи в попытках заставить его работать.
ahamednafeel
@Dave Спасибо... Если я сделал это так, как я могу использовать его для Windows XP ??
Dave Kreskowiak
Когда он работает на Windows 7, он будет работать и на Windows XP. Вы просто сейчас вынуждены делать это правильно, а не" взламывать", поддерживаемый только на XP и ниже.
ahamednafeel
Дэйв, мне нужно знать еще кое-что.. почему мне нужно, МПК именованным каналам для данного вопроса?? не могли бы Вы направить меня, пожалуйста!!