#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