Как автоматически запустить (или создать и запустить) службу Windows после развертывания кода в экземпляре EC2 - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь создать конвейер, который может автоматически развертываться через AWS-CodeDeploy и запустить службу windows на экземпляре EC2, но у меня возникают проблемы с правильным сценарием powershell.

У меня есть следующее:

Appspec.yml

version: 0.0
os: windows
files:
  - source: \
    destination: C:\temp\MyApp
hooks:
  ApplicationStop:
    - location: DeploymentScripts\applicationStop.bat
      timeout: 180
  ApplicationStart:
    - location: DeploymentScripts\applicationStart.bat
      timeout: 180

applicationStart.bat

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe C:\temp\MyApp\DeploymentScripts\service_create_start.ps1 -ServiceName MyService -BinaryPath 'C:\temp\MyApp\MyService.exe' -DisplayName 'Test Application' -Description 'This is a test'

И следующий powershell service_create_start.ps1:

Param([Parameter(Mandatory=$true)][string]$ServiceName,[Parameter(Mandatory=$true)][ValidateScript({Test-Path $_ -PathType 'leaf'})][string]$BinaryPath, [string]$Displayname, [string]$Description)

If (Get-Service $ServiceName -ErrorAction SilentlyContinue) {

    If ((Get-Service $ServiceName).Status -eq 'Running') {

        Stop-Service $ServiceName
        Write-Host "Stopping $ServiceName"

    } Else {

        Write-Host "$ServiceName found, but it is not running."

    }

} Else {

    Write-Host "$ServiceName not found. Creating new Windows service."

}

$ArgumentList = '-Name "{0}" -BinaryPathName "{1} -k netsvcs" -DisplayName "{2}" -StartupType Automatic -Description "{3}"' -f $ServiceName, $BinaryPath, $DisplayName, $Description

New-Service $ArgumentList

Start-Service $ServiceName

Я создал файл bat, потому что казалось, что я не могу запустить скрипт powershell из кода развертывания с параметрами. Я не связан с этим иначе.

Моя первая проблема - это сообщение «BinaryPathName». У меня такое ощущение, что это проблема с моими цитатами в одном из этих файлов.

Моя вторая проблема (если я введу это вручную при тестировании) заключается в том, что я получаю исключение «Доступ запрещен» в строке «Новая служба».

Чтобы решить эту проблему, я попытался использовать Start-Process и глагол RunAs для запуска повышенного уровня powershell, однако у меня возникают проблемы с определением синтаксиса для добавления моих параметров (помимо имени файла ps1) с этим синтаксисом.

Я даже на правильном пути здесь, или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 13 ноября 2018

Я не думаю, что вы можете передавать такие параметры (как одну строку), вам лучше использовать splatting:

$myInput = @{
    Name = $ServiceName
    BinaryPathName = '{0} -k netsvc' -f $BinaryPath
    StartupType = 'automatic' 
    DisplayName = $DisplayName
    Description = $Description
}
New-Service @myInput

чтение: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-6

...