Настройка WinRM через HTTPS на нескольких компьютерах с помощью Powershell
Настройка WinRM через HTTPS на нескольких компьютерах с помощью Powershell
У меня есть следующий сценарий, который я собрал для настройки WinRM через HTTPS, и он отлично работает на каждой машине. Мне трудно перекодировать его для удаленного запуска на нескольких машинах, расположенных в текстовом файле.
Также в качестве бонуса я хотел бы иметь какой-то журнал и проверку на месте для машин, которые выходят из строя или возвращают какие-либо ошибки.
Любая помощь будет принята с благодарностью.
$user = "Account to Use - Service Account Suggested"
$Certname = "HOSTNAME FQDN"
$Cert = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname $Certname
$pw = ConvertTo-SecureString -String "Pazzword" -Force -AsPlainText
$thumbprint = $Cert.Thumbprint
WinRM e winrm/config/listener
#winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="$Certname"; CertificateThumbprint=$thumbprint}'
New-Item WSMan:\localhost\Listener -Address * -Transport HTTPS -HostName $Certname -CertificateThumbPrint $thumbprint
$port=5986
netsh advfirewall firewall add rule name="Windows Remote Management (HTTPS-In)" dir=in action=allow protocol=TCP localport=$port
net localgroup "Remote Management Users" /add $user
net localgroup "Event Log Readers" /add $user
Restart-Service WinRM
Restart-Service Winmgmt -Force
#Adding the below script should replace "winrm configSDDL default"
$GENERIC_READ = 0x80000000
$GENERIC_WRITE = 0x40000000
$GENERIC_EXECUTE = 0x20000000
$GENERIC_ALL = 0x10000000
# get SID of user/group to add
$user_sid = (New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $user).Translate([System.Security.Principal.SecurityIdentifier])
# get the existing SDDL of the WinRM listener
$sddl = (Get-Item -Path WSMan:\localhost\Service\RootSDDL).Value
# convert the SDDL string to a SecurityDescriptor object
$sd = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList $false, $false, $sddl
# apply a new DACL to the SecurityDescriptor object
$sd.DiscretionaryAcl.AddAccess(
[System.Security.AccessControl.AccessControlType]::Allow,
$user_sid,
($GENERIC_READ -bor $GENERIC_EXECUTE),
[System.Security.AccessControl.InheritanceFlags]::None,
[System.Security.AccessControl.PropagationFlags]::None
)
# get the SDDL string from the changed SecurityDescriptor object
$new_sddl = $sd.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All)
# apply the new SDDL to the WinRM listener
Set-Item -Path WSMan:\localhost\Service\RootSDDL -Value $new_sddl -Force```
2 ответа
Продолжение нашего обмена комментариями.
Предполагая эту строку...
$user = "Account to Use - Service Account Suggested"
... будет одинаковым для всех систем, затем предварительно заполните это тем, что есть, затем...
(Get-ADComputer -Filter 'OperatingSystem -NotLike "*Server" -and enabled -eq "True"').Name |
ForEach {
$user = "Account to Use - Service Account Suggested"
$Certname = $PSItem
...
}
Вы уже запрашиваете здесь имя сертификата динамически...
$Cert = New-SelfSignedCertificate -certstorelocation 'cert:\localmachine\my' -dnsname $Certname
$pw = ConvertTo-SecureString -String "Pazzword" -Force -AsPlainText
$thumbprint = $Cert.Thumbprint
... так что передавать нечего.
Тем не менее, чтобы запустить этот сценарий на удаленной цели, просто используйте обычную настройку удаленного сеанса PSRemoting по умолчанию.
about_Remote - PowerShell | Документы Microsoft
about_Remote_Requirements - PowerShell | Документы Microsoft
Invoke-Command -ComputerName Server01 -ScriptBlock {Get-Culture}
Ну вот так...
$Creds = Get-Credential -Credential "$env:USERDOMAIN\$env:USERNAME"
(Get-ADComputer -Filter 'OperatingSystem -NotLike "*Server" -and enabled -eq "True"').Name |
ForEach {
Invoke-Command -ComputerName $PSItem -ScriptBlock {
$user = "Account to Use - Service Account Suggested"
$Certname = $PSItem
...
} -Credential $Creds
}
Приведенный ниже сценарий дает мне следующую ошибку
CloneCert and DnsName parameters cannot both be empty
+ CategoryInfo : NotSpecified: (:) [New-SelfSignedCertificate], ParameterBindingException
+ FullyQualifiedErrorId : RuntimeException,Microsoft.CertificateServices.Commands.NewSelfSignedCertificateCommand
+ PSComputerName : XXX.local
Listener
Address = *
Transport = HTTP
Port = 5985
Hostname
Enabled = true
URLPrefix = wsman
CertificateThumbprint
ListeningOn = 127.0.0.1, 172.17.62.29, ::1, fe80::c5c5:a94f:341c:48fa%13
Cannot validate argument on parameter 'HostName'. The argument is null or empty. Supply an argument that is not null or empty and then try the command again.
+ CategoryInfo : InvalidData: (:) [New-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.NewItemCommand
+ PSComputerName : XXXX.local
An error occurred while attempting to contact the Windows Firewall service. Make sure that the service is running and try your request again.
$Computers = get-content "C:\temp\regkey.txt"
Foreach ($Computer in $Computers)
{
Invoke-Command -ComputerName $Computer -ScriptBlock {
$user = "bmonitor-ps"
#$Certname = $Computer
$Cert = New-SelfSignedCertificate -certstorelocation cert:\localmachine\my -dnsname $Computer
$thumbprint = $Cert.Thumbprint
WinRM e winrm/config/listener
#winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="$Certname"; CertificateThumbprint=$thumbprint}'
New-Item WSMan:\localhost\Listener -Address * -Transport HTTPS -HostName $Computer -CertificateThumbPrint $thumbprint
$port=5986
netsh advfirewall firewall add rule name="Windows Remote Management (HTTPS-In)" dir=in action=allow protocol=TCP localport=$port
net localgroup "Remote Management Users" /add $user
net localgroup "Event Log Readers" /add $user
Restart-Service WinRM
Restart-Service Winmgmt -Force
#Adding the below script should replace "winrm configSDDL default"
$GENERIC_READ = 0x80000000
$GENERIC_WRITE = 0x40000000
$GENERIC_EXECUTE = 0x20000000
$GENERIC_ALL = 0x10000000
# get SID of user/group to add
$user_sid = (New-Object -TypeName System.Security.Principal.NTAccount -ArgumentList $user).Translate([System.Security.Principal.SecurityIdentifier])
# get the existing SDDL of the WinRM listener
$sddl = (Get-Item -Path WSMan:\localhost\Service\RootSDDL).Value
# convert the SDDL string to a SecurityDescriptor object
$sd = New-Object -TypeName System.Security.AccessControl.CommonSecurityDescriptor -ArgumentList $false, $false, $sddl
# apply a new DACL to the SecurityDescriptor object
$sd.DiscretionaryAcl.AddAccess(
[System.Security.AccessControl.AccessControlType]::Allow,
$user_sid,
($GENERIC_READ -bor $GENERIC_EXECUTE),
[System.Security.AccessControl.InheritanceFlags]::None,
[System.Security.AccessControl.PropagationFlags]::None
)
# get the SDDL string from the changed SecurityDescriptor object
$new_sddl = $sd.GetSddlForm([System.Security.AccessControl.AccessControlSections]::All)
# apply the new SDDL to the WinRM listener
Set-Item -Path WSMan:\localhost\Service\RootSDDL -Value $new_sddl -Force
}
}