Не удалось запустить службу .NET 5.0 от имени другого пользователя

#c# #asp.net-core #.net-5

Вопрос:

Фон:

Я пытаюсь получить ASP.NET 5.0 служба для запуска от имени другого пользователя (по shift right click и выбрав Запуск от имени другого пользователя) из-за DCOM, но я не могу этого сделать и просто получаю следующую ошибку:

 Unhandled exception. System.InvalidOperationException: Process has exited, so the requested information is not available.
   at System.Diagnostics.Process.EnsureState(State state)
   at System.Diagnostics.Process.get_SessionId()
   at Microsoft.Extensions.Hosting.WindowsServices.WindowsServiceHelpers.IsWindowsService()
   at Microsoft.Extensions.Hosting.WindowsServiceLifetimeHostBuilderExtensions.UseWindowsService(IHostBuilder hostBuilder, Action`1 configure)
   at Microsoft.Extensions.Hosting.WindowsServiceLifetimeHostBuilderExtensions.UseWindowsService(IHostBuilder hostBuilder)
   at Historian.Service.Program.CreateHostBuilder(String[] args) in ..Program.cs:line 31
   at Historian.Service.Program.Main(String[] args) in ..Program.cs:line 27
 

Ниже приведен мой базовый сервисный код.

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();//This is "Line 27"
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices(services =>//This is "Line 31"
                {
                    services.AddLogging(logging => logging.AddConsole().AddDebug());                  
                })
                .ConfigureWebHost(config =>
                {
                    config.UseKestrel((builderContext, options) =>
                    {
                        options.Configure(builderContext.Configuration.GetSection("Kestrel"));
                    })
                    .UseStartup<Startup>();
                })
                .UseWindowsService();
    }
 

И вот мой Startup код:

 public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers().AddNewtonsoftJson();

            services.Configure<GzipCompressionProviderOptions>(options =>
            {
                options.Level = System.IO.Compression.CompressionLevel.Fastest;
            });

            services.AddResponseCompression(options =>
            {
                options.Providers.Add<GzipCompressionProvider>();
                options.EnableForHttps = true;
            });

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyService", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Historian.Collector.Service v1"));
            }

            app.UseResponseCompression();

            //app.UseHttpsRedirection();

            app.UseRouting();            

            //app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
 

Additional Info:

When running the service via Services and adding the correct user credentials through the Logon option within Properties , the service also does not work. The user is also on a different domain.

Current Workaround:

I am able to get an instance of the service working by opening a cmd window as a different user (by shift right click and selecting Run as different user) and then opening the service from the cmd window.

My Question:

Why does my service not run as a different user? Are there any code based solutions that I may implement?

UPDATE

Благодаря тестированию я смог изолировать проблему следующим образом:

  1. Создайте новую учетную запись локального пользователя в Windows
  2. Предоставьте созданной учетной записи пользователя полный контроль над содержимой папкой отладки (щелкните правой кнопкой мыши > свойства >> безопасность >>> редактировать >>>> добавить нового пользователя >>>>> назначить «Полный контроль» > > > > > > сохранить)
  3. Предоставьте созданной учетной записи пользователя права «Вход в систему как служба» (Панель управления > Инструменты администрирования >> Локальная политика безопасности >>> Выпадающий список «Локальные политики» >>>> Дважды щелкните «Назначение прав пользователя» >>>>> Дважды щелкните «Вход в систему как служба» > > > > > > > Добавьте созданную учетную запись пользователя >>>>>>> ОК)
  4. Shift Щелкните правой кнопкой мыши > Запуск от имени другого пользователя на test.exe консольное приложение (см. код ниже)
  5. Введите имя локального пользователя и пароль и запустите
  6. Подключение к процессу из Visual Studio ( Console.ReadLine(); дает вам время для подключения к процессу)
  7. Просмотрите код и посмотрите ошибку в разделе «Строка, в которой произошла ошибка».
 public static void Main(string[] args)
    {
        //This is here so that one can attach to the process
        Console.WriteLine("Press any key to continue...");  
        Console.ReadLine();

        try
        {
            CreateHostBuilder(args).Build().Run();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        IHostBuilder hostBuilder = Host.CreateDefaultBuilder(args);

        hostBuilder.ConfigureServices(services =>
        {
        });

        try
        {
            hostBuilder.UseWindowsService();//Line where error occurs
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        return hostBuilder;

    }
 

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

1. Вы пробовали это: Диспетчер задач > Службы (щелкните правой кнопкой мыши на службе) >> Открыть службы (щелкните правой кнопкой мыши на службе) >>> Свойства >>>> Вход в систему > > > > > > Эта учетная запись

2. Привет @Nemavhidi, я попробовал это и заявил об этом в разделе «Дополнительная информация». Извините, если это было неясно, я отредактировал свой вопрос, чтобы отразить это.

3. Проверьте журнал событий для получения дополнительной информации (система и приложение). Ошибка, которую вы получаете сейчас, является очень общей, которая просто говорит, что процесс завершен; диспетчер управления службами и/или среда выполнения могут регистрировать больше.

4. Привет @JeroenMostert, в окне просмотра событий не было ничего другого. Пожалуйста, ознакомьтесь с моим обновлением, чтобы узнать, как воспроизвести ошибку.