kenstern Ответов: 3

Запустите процесс в сеансе 1 из службы Windows 7


У меня есть служба, работающая в Windows 7. В Windows 7 все службы работают в сеансе 0. Из этой службы я хочу создать интерактивный сеанс пользователя (в сеансе, отличном от сеанса 0) и запустить приложение в этом сеансе. Моя проблема заключается в том, что когда я вызываю LogonUser для запуска интерактивного сеанса пользователя, а затем использую CreateProcessAsUser для запуска приложения, приложение заканчивается запуском в сеансе 0.

Весь мой код - это C#.

Вот соответствующий код:

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool LogonUser(
    string principal,
    string authority,
    string password,
    UInt32 logonType,
    UInt32 logonProvider,
    out    IntPtr token);

[DllImport("advapi32.dll", SetLastError=true)]
static extern bool CreateProcessAsUser(
    IntPtr hToken,
    string lpApplicationName,
    string lpCommandLine,
    IntPtr lpProcessAttributes,
    IntPtr lpThreadAttributes,
    bool bInheritHandles,
    int dwCreationFlags,
    IntPtr lpEnvironment,
    string lpCurrentDirectory,
    ref STARTUPINFO lpStartupInfo,
    ref PROCESS_INFORMATION lpProcessInformation);

IntPtr token;
LogonUser("UserName", ".", "Password", 
    LogonTypes.Interactive,LogonProviders.Default, out token)

<code to impersonate user>
string hd = Environment.ExpandEnvironmentVariables("%USERPROFILE%");

IntPtr envBlock = IntPtr.Zero;
CreateProcessAsUser(token, "PathToMenu.exe",
    NORMAL_PRIORITY_CLASS |CREATE_UNICODE_ENVIRONMENT,
    "WinSta0\\Default", hd, envBlock, "Menu");


Кто-нибудь может сказать мне, что я делаю не так?

Orcun Iyigun

Обновил теги.

3 Ответов

Рейтинг:
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

Дэйв, мне нужно знать еще кое-что.. почему мне нужно, МПК именованным каналам для данного вопроса?? не могли бы Вы направить меня, пожалуйста!!

Рейтинг:
2

triendl.kj

Ответ Дейва неверен только потому, что речь идет о запуске процесса в пользовательском сеансе (сеанс 1 и выше) из службы, а не о представлении графического интерфейса в сеансе 0.

Способ сделать это-выдать себя за пользователя сеанса, а затем создать процесс.
Смотреть на:
WTSQueryUserToken чтобы получить основной токен пользователя
ImpersonateLoggedOnUser
CreateProcessAsUser чтобы запустить процесс на WinSta0\Default рабочий стол


Рейтинг:
1

Robson Carvalho Joaquim

Дэйв совершенно не прав! Как подруга сказала использовать вызовы createprocessasuser

Подрыв Vista UAC как в 32, так и в 64-битных архитектурах[^]


CHill60

Эта статья датирована 2009 годом и предназначена для Vista. С тех пор Windows немного продвинулась вперед, и многие дыры в системе безопасности были заполнены. Если вы прочтете весь поток, вы найдете...Цитата: Теперь вы знаете, почему Microsoft говорит, что не делайте этого. Функциональность была отгорожена стеной в 7. Вы не можете создать интерактивный процесс на рабочем столе пользователя из сеанса 0 по соображениям безопасности

Robson Carvalho Joaquim

Ваше утверждение не соответствует действительности. Я использую CreateProcessAsUser в окне 10 и работаю безупречно

Попробуйте сами и вернитесь сюда, чтобы изменить свой комментарий.

http://download.microsoft.com/download/7/E/7/7E7662CF-CBEA-470B-A97E-CE7CE0D98DC2/Session0Changes.docx