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

#c# #windows-7 #service

#c# #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");
  

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

Комментарии:

1. Пользователь856021, привет, брат, если ты решил свою проблему, можешь ли ты опубликовать код для нее? Я использую Windows 8 и работаю с той же проблемой.

Ответ №1:

При попытке запустить процесс из службы в Vista / 7 может произойти множество ошибок. Я бы рекомендовал вам начать с этой статьи и адаптировать ее к вашим потребностям. Я могу сказать вам, что я использовал и немного изменил код в статье, и он работает. Извините, я не могу показать это вам, потому что измененный код принадлежит моей компании.

Комментарии:

1. Мэтт — Большое спасибо — я думаю, это поможет мне начать. Я надеялся, что смогу справиться с этим случаем без входа пользователя в систему, используя LogonUser для создания сеанса пользователя. Это отлично работает в WinXP, но не в Win7 с изоляцией Sessioin0.

2. Это мне очень помогло… дал мне представление о том, как решить мою проблему. 1