Проблема с разрешениями при запуске приложения .NET из службы .NET от имени другого пользователя?

Я пытаюсь запустить приложение .NET под другим пользователем из службы .NET. Идея состоит в том, чтобы создать изолированное хостинговое приложение в Windows. В службе я программно создал пользователя в Windows, создал папку для этого пользователя и загрузил хост .exe с сервера в эту папку. Затем я запускаю хост .exe с помощью System.Diagnostics.Process. Вот StartInfo для процесса:

_process = new Process
{
    StartInfo =
    {
        Arguments = " -debug",
        FileName = instanceDirectory + "host.exe",
        WorkingDirectory = instanceDirectory,
        UseShellExecute = false,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        UserName = Helpers.GetUserNameForInstance(_hostid),
        Password = _hostpass,
        Domain = ""
    },
    EnableRaisingEvents = true
};

Когда я запускаю службу как СЛУЖБУ, процесс мгновенно завершается с ошибкой с кодом -1073741502. но когда я запускаю службу от имени того же пользователя, который указан в службе Windows, но в интерактивном режиме в консоли, все работает нормально. Это происходит только при запуске службы в качестве СЛУЖБЫ, а не непосредственно в консоли.

Любая помощь приветствуется. Это уже давно стало головной болью, и это последнее средство :(


person Andrew Ortman    schedule 18.01.2010    source источник
comment
вы тестировали тот же код, работающий в консольном приложении?   -  person Jader Dias    schedule 18.01.2010
comment
да, все работает нормально работает в автономном режиме .. у него проблемы только с запуском как службы.   -  person Andrew Ortman    schedule 18.01.2010
comment
Привет, Как вы сказали, это похоже на проблему с разрешением, потому что он запускается, когда это не служба. Эта ссылка может помочь: asprosys.blogspot.com/2009 / 03 /   -  person keyboardP    schedule 18.01.2010
comment
Как вы определили и зарегистрировали свою услугу? Помните, что они могут запускаться автоматически, без создания каких-либо пользовательских экземпляров.   -  person ChrisBD    schedule 19.01.2010
comment
@AndrewOrtman, жаль, что здесь нет ответа, потому что я столкнулся с той же проблемой.   -  person John-Philip    schedule 19.06.2015


Ответы (4)


Похоже, что при использовании new Process() с именем пользователя и паролем, а сервисный режим "не вычисляет" :)

Цитата из MSDN:

Вы можете изменить параметры, указанные в свойстве StartInfo, до момента вызова метода Start для процесса. После запуска процесса изменение значений StartInfo не влияет на связанный процесс и не перезапускает его. Если вы вызываете метод Start (ProcessStartInfo) с установленными свойствами ProcessStartInfo .. ::. UserName и ProcessStartInfo .. ::. Password, вызывается неуправляемая функция CreateProcessWithLogonW, которая запускает процесс в новом окне, даже если значение свойства CreateNoWindow имеет значение true или значение свойства WindowStyle - Hidden.

Кроме того, посмотрев документацию CreateProcessWithLogonW:

lpStartupInfo [дюйм]

Указатель на структуру STARTUPINFO. Приложение должно добавить разрешение для указанной учетной записи пользователя на указанную оконную станцию ​​и рабочий стол, даже для WinSta0 \ Default.

Если член lpDesktop имеет значение NULL или пустую строку, новый процесс наследует рабочий стол и оконную станцию ​​своего родительского процесса. Приложение должно добавить разрешение для указанной учетной записи пользователя унаследованной оконной станции и рабочему столу.

В .NET StartupInfo нет lpDesktop, с другой стороны, у пользователя SERVICE нет рабочего стола, что может вызвать вашу проблему.

Короче говоря, попробуйте установить LoadUserProfile на true, чтобы загрузить информацию о пользователе из реестра, или, может быть, вам нужно установить рабочий каталог и т. Д.

Для дальнейшего исследования вам следует проверить свою среду и, возможно, записать, к каким файлам осуществляется доступ с помощью FileMon.

person Gyuri    schedule 18.01.2010

Я бы попытался создать процесс в олицетворенном контексте вновь созданного пользователя, как показано ниже.

[DllImport("advapi32.DLL", SetLastError = true)]
public static extern int LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

[DllImport("advapi32.DLL")]
public static extern bool ImpersonateLoggedOnUser(IntPtr hToken);

static void Main()
{             
    IntPtr admin_token = new IntPtr();
    WindowsIdentity wid_admin = null;
    WindowsImpersonationContext wic = null;

    LogonUser("username", "domain", "password", 9, 3, out admin_token);
    wid_admin = new WindowsIdentity(admin_token);
    wic = wid_admin.Impersonate();

    _process = new Process
    {
        StartInfo =
        {
            Arguments = " -debug",
            FileName = instanceDirectory + "host.exe",
            WorkingDirectory = instanceDirectory,
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            UserName = Helpers.GetUserNameForInstance(_hostid),
            Password = _hostpass,
            Domain = ""
        },
        EnableRaisingEvents = true
    };

    if (wic != null) wic.Undo();
    CloseHandle(admin_token);
}
person Sean Kornish    schedule 20.12.2012
comment
Я пробовал это, но, похоже, это не помогло. Возвращаясь к тому, что цитировал Гьюри, кажется, что пользователю нужно дать разрешение на использование оконной станции и рабочего стола, к которым принадлежит служба. - person jamessan; 20.12.2012

Двойной переход между серверами может привести к потере учетных данных службы, возможно, настройка Kerberos решит эту проблему.

http:// Neverknewthat.wordpress.com/2009/05/14/kerberos/ < / а>

person Paul Spencer    schedule 18.01.2010

0xc0000142 (-1073741502) имеет статус STATUS_DLL_INIT_FAILED:

Инициализация библиотеки динамической компоновки [имя] не удалась. Процесс аварийно завершается.

Как указано на веб-сайте TenaciousImpy, вам необходимо предоставить разрешения учетной записи для оконной станции и рабочего стола. Но если программа интерактивна, вам также необходимо установить идентификатор сеанса для токена процесса.

person wj32    schedule 18.01.2010