Для службы Windows dotnetcore 3.1 как остановить, удалить, установить и запустить службу с помощью сценария powershell 5.1

#powershell #.net-core #azure-devops #windows-services #.net-core-3.1

#powershell #.net-core #azure-devops #windows-службы #.net-core-3.1

Вопрос:

Для начала я создал приведенный ниже скрипт для PS 5.1 (я знаю, что в PS 6.0 есть опция удаления службы, но не 5.1).

У меня есть все необходимые .exe, dll и конфигурации вместе с этим скриптом, который упакован как артефакт и будет развернут в каталоге головного узла целевого объекта.

Не уверен, что приведенный ниже сценарий удалит и установит службу. Но я вижу, что при запуске он удаляет и запускает новую службу.**

 ```
$acl = Get-Acl "C:Program FilesMattWservice"
$aclRuleArgs = "XYZ", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
if (Get-Service "Wservice" -ErrorAction 'SilentlyContinue')
{
     Stop-Service -Name Wservice -ErrorAction SilentlyContinue -Force
     (Get-WmiObject -Class Win32_Service -filter "Name='Wservice'").delete()
     Write-Host "Please wait until removing the : Wservice  " 
     Start-Sleep -s 30 
    }
$Username = 'xyz'
$Password = '123'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$pass
New-Service -Name  Wservice -BinaryPathName "C:Program FilesMattWserviceWservice.exe" -Credential $MySecureCreds -DisplayName "WserviceService"  -StartupType Automatic
Start-Service -Name "Wservice"
```
  

Ответ №1:

  • Похоже, что в Powershell core 6.0 / 7.0 dosent get-wmiobject , WMI устарел, тогда мы должны использовать CIM с использованием Get-CIMInstance .

Остальные все в порядке. Основной код:

 $acl = Get-Acl "C:Program FilesMattWservice"
$aclRuleArgs = "XYZ", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
if (Get-Service "Wservice" -ErrorAction 'SilentlyContinue')
{
     Stop-Service -Name Wservice -ErrorAction SilentlyContinue -Force
     (Get-CIMInstance -Class Win32_Service -filter "Name='Wservice'").delete()
     Write-Host "Please wait until removing the : Wservice  " 
     Start-Sleep -s 30 
    }
$Username = 'xyz'
$Password = '123'
$pass = ConvertTo-SecureString -AsPlainText $Password -Force
$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Username,$pass
New-Service -Name  Wservice -BinaryPathName "C:Program FilesMattWserviceWservice.exe" -Credential $MySecureCreds -DisplayName "WserviceService"  -StartupType Automatic
Start-Service -Name "Wservice"
  

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

1. Спасибо @wasif Hasan за проверку и исправление. Но у меня есть зависимость от использования PS 5.1, а не 6.0 или 7.0. Также я видел некоторый код с приведенными ниже параметрами среды выполнения для .netframework, не уверен, есть ли что-то подобное для использования во время выполнения .netcore3.1 $RunTimeDirectory = $([System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) $InstallUtilPath = ("{0}{1}" -f $RunTimeDirectory,"InstallUtil.exe") . Также, если я правильно выполняю остановку, удалите, затем установите и запустите чисто без проблем с написанным сценарием.

2. Просто замечание: что касается этого… [Но у меня есть зависимость от использования PS 5.1], это не имеет значения, поскольку CIM также есть в версии 5x, и лучше привыкнуть использовать CIM против WMI, если только CIM не дает вам, что WMI нет. Кроме того, избегайте размещения ответа на код в комментариях, обновите исходное сообщение, чтобы его можно было отслеживать и реагировать на него более адекватно. Однако, судя по вашему вопросу, вы, похоже, спрашиваете [Как мне реплицировать командлеты PSCore Remove-Service в PSv5x?]. Или я ошибаюсь?

3. powershell «удалить службу»

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