Служба Windows не запускается с ошибкой 5: доступ запрещен

Я борюсь с проблемой здесь. Итак, я создал службу Windows, сделал сценарий установки и зарегистрировал его в Windows. Я использую пользовательскую учетную запись, которую я создаю в том же сценарии, и даю ей права на вход в качестве службы с использованием библиотеки Carbon, чтобы иметь возможность делать это из PowerShell (описано здесь в разделе Установить или предоставить пользователю вход в качестве службы прямо через Powershell)

При запуске службы (как вручную, так и через cmd) я получаю ошибку 5: Доступ запрещен. Я не понимаю почему, я даже пытался дать учетной записи полные права доступа ко всему диску C:\.

Вот как я создаю пользователя

net user MyServiceAccount MyPassword /add /expires:never /passwordchg:no

Вот как я даю ему разрешение на вход в качестве службы

$Identity = "MyServiceAccount"
$privilege = "SeServiceLogonRight" 
$CarbonDllPath = $PSScriptRoot + "\Carbon.dll"
 
[Reflection.Assembly]::LoadFile($CarbonDllPath)
[Carbon.Lsa]::GrantPrivileges( $Identity, $privilege )

(Вход в систему, поскольку разрешения службы, кажется, работают, так как до этого произошел сбой с ошибкой, связанной с этой проблемой) Я прочитал большое количество сообщений по этой теме, но не смог решить проблему. Итак, еще раз, мой вопрос: что может быть причиной ошибки «Отказано в доступе»?

Обновить

Пробовал запускать под учетной записью администратора (зайти как...), тоже самое - Доступ запрещен. В EventLog нет ничего, кроме службы MonitoringService. Не удалось запустить службу из-за следующей ошибки: Отказано в доступе. сообщение в системном журнале событий.


person Jurijs Kastanovs    schedule 15.05.2014    source источник
comment
Вероятно, выдается ошибка отказа в доступе к какому-то ключу реестра вместо файла.   -  person Vesper    schedule 15.05.2014
comment
@Vesper, есть способ узнать? Я имею в виду, как я могу получить представление о том, с каким разделом реестра он может не работать?   -  person Jurijs Kastanovs    schedule 15.05.2014
comment
Ваше приложение должно предоставлять журналы и / или другую информацию об отладке, чтобы оно не паниковало с необработанным 0xC0000005 поверх трассировки стека. Если вы контролируете его код, убедитесь, что у вас есть try-catch для любой внешней операции, чтобы она не закончилась паникой. Если нет, используйте инструменты Sysinternals Process Monitor, regmon и filemon для записи активности реестра и отладки приложения.   -  person Vesper    schedule 15.05.2014
comment
@Vesper Я исключил весь свой код из службы, оставив только стандартную инициализацию запуска. И только что попробовал Sysinternals ProcessMonitor безрезультатно. Служба сразу падает, поэтому я не думаю, что ее можно как-то отладить, нет?   -  person Jurijs Kastanovs    schedule 15.05.2014
comment
Любые подсказки в журналах событий безопасности на сервере?   -  person mjolinor    schedule 15.05.2014
comment
@mjolinor ничего ... только это в журнале системных событий: не удалось запустить службу MonitoringService из-за следующей ошибки: доступ запрещен.   -  person Jurijs Kastanovs    schedule 15.05.2014
comment
@JurijsKastanovs Даже если он сразу выйдет из строя, вы можете увидеть идентификатор процесса в журналах filemon + regmon, пытающихся получить доступ к файлу или реестру с ошибкой. Кроме того, попробуйте добавить службу с помощью команды sc add, затем переназначьте ее для запуска под определенным пользователем, а затем повторите попытку.   -  person Vesper    schedule 16.05.2014


Ответы (1)


Итак, мне удалось решить мою проблему, используя другую процедуру установки службы. Похоже, это была проблема установки, а не проблема, связанная с правами пользователя. Ниже приведен пример рабочего скрипта, если кому интересно:

# ALISE MONITORING SERVICE INSTALLATION #

$service_fullname = "Alise.MonitoringService"
$username = ".\AliseMonitoring"
$password = "mypassword"
$pause = 0
$exeName = "MonitoringService.exe"

$ErrorActionPreference = "Stop"
$nl = [Environment]::NewLine

$dir = Split-Path $MyInvocation.MyCommand.Path
$service_path = join-path $dir "$exeName"
$service_path = resolve-path $service_path


Write-Host $nl
Write-Host "Service name: $service_fullname" -foregroundcolor green
Write-Host "Service logon identity: $username" -foregroundcolor green
Write-Host "Service installation path: $service_path" -foregroundcolor green
Write-Host $nl

Write-Host "Creating user if necessary..." -foregroundcolor green
start-process create_user.bat -Wait
Write-Host "Granting user log on as service rights..." -foregroundcolor green
$PSScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
$Identity = "AliseMonitoring"
$privilege = "SeServiceLogonRight" 
$CarbonDllPath = $PSScriptRoot + "\Carbon.dll"
[Reflection.Assembly]::LoadFile($CarbonDllPath)
[Carbon.Lsa]::GrantPrivileges( $Identity, $privilege )
Write-Host $nl

$service = Get-WmiObject -Class Win32_Service -Filter "Name = '$service_fullname'"
if ($service -ne $null) 
{ 
    Write-Host "Service already exists, attempting stop and delete:" -foregroundcolor green
    Write-Host "Stop service $service_fullname..."
    $service | stop-service
    Write-Host "Delete service $service_fullname..."
    $service.Delete()
    Write-Host "Service $service_fullname deleted." 
    Write-Host $nl
}

Write-Host $nl

Write-Host "Registering service $service_fullname for $service_path ..." -foregroundcolor green
New-Service -Name $service_fullname -BinaryPathName $service_path -DisplayName $service_fullname -Description "Alise monitoring serviss." -StartupType Automatic
$service = Get-WmiObject -Class Win32_Service -Filter "Name = '$service_fullname'"
Write-Host "Service registred."

$res = sc.exe config $service_fullname obj= $username password= $password

if ($LASTEXITCODE -ne 0)
{
   Write-Host "username: $username password: $password" -foregroundcolor green
   throw $res
}

#Event log and source registration
Write-Host $nl
Write-Host "Registering event source Alise.MonitoringService" -foregroundcolor green
if ([system.diagnostics.eventlog]::SourceExists("Alise.MonitoringService") -eq $false) 
{
  [system.diagnostics.eventlog]::CreateEventSource("Alise.MonitoringService", "Alise")
  Write-Host "Created event source: Alise.MonitoringService"
}
else
{
    Write-Host "Event source Alise.MonitoringService allready exists."
}

Write-Host $nl
Write-Host "Starting service..." -foregroundcolor green
Start-Service $service_fullname
Write-Host "Service started!" -foregroundcolor green

if ($pause -eq 1)
{
    read-host -prompt "Press enter to exit"
}
person Jurijs Kastanovs    schedule 16.05.2014