#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
Благодаря тестированию я смог изолировать проблему следующим образом:
- Создайте новую учетную запись локального пользователя в Windows
- Предоставьте созданной учетной записи пользователя полный контроль над содержимой папкой отладки (щелкните правой кнопкой мыши > свойства >> безопасность >>> редактировать >>>> добавить нового пользователя >>>>> назначить «Полный контроль» > > > > > > сохранить)
- Предоставьте созданной учетной записи пользователя права «Вход в систему как служба» (Панель управления > Инструменты администрирования >> Локальная политика безопасности >>> Выпадающий список «Локальные политики» >>>> Дважды щелкните «Назначение прав пользователя» >>>>> Дважды щелкните «Вход в систему как служба» > > > > > > > Добавьте созданную учетную запись пользователя >>>>>>> ОК)
- Shift Щелкните правой кнопкой мыши > Запуск от имени другого пользователя на test.exe консольное приложение (см. код ниже)
- Введите имя локального пользователя и пароль и запустите
- Подключение к процессу из Visual Studio (
Console.ReadLine();
дает вам время для подключения к процессу) - Просмотрите код и посмотрите ошибку в разделе «Строка, в которой произошла ошибка».
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, в окне просмотра событий не было ничего другого. Пожалуйста, ознакомьтесь с моим обновлением, чтобы узнать, как воспроизвести ошибку.