Powershell: So lesen Sie sichere Zeichenfolgen aus einer Textdatei mit einem Windows-Dienst

Powershell: So lesen Sie sichere Zeichenfolgen aus einer Textdatei mit einem Windows-Dienst

Ich habe die Anmeldeinformationen meiner vSphere-Umgebung mit der Powershell in Textdateien gespeichert ConvertFrom-SecureString. Ich möchte diese Anmeldeinformationen in meinem Powershell-Skript mit dem folgenden Befehl verwenden:

$password4host = get-content C:\shutdown\HostsCred.txt | convertto-securestring

Wenn ich das Powershell-Skript über einen Dienst ausführen möchte, erhalte ich die Fehlermeldung, dass die Anmeldeinformationen nicht aus den Textdateien ausgelesen werden können. Dies scheint damit zusammenzuhängen, dass das Speichern der sicheren Zeichenfolgen in Textdateien an den Benutzer gebunden ist, der diese Anmeldeinformationen in den Textdateien gespeichert hat. Nur der Benutzer selbst kann die Anmeldeinformationen entschlüsseln.

Code-Auszug:

$time = ( get-date ).ToString('HH-mm-ss')
$date = ( get-date ).ToString('dd-MM-yyyy')
$logfile = New-Item -type file "C:\shutdown\ShutdownLog-$date-$time.txt" -Force
Import-Module -Name VMware.*
# Some variables
$vcenter = "10.10.10.10"
$username = "[email protected]"
$username4host = "fakeuser"
$cluster = "ESXi-Cluster"
$datacenter = "Datacenter"
$vCenterVMName = "VMware vCenter Server" #Name of vCenter VM
$StarWindVM1 = "Starwind-VM" #Name of first StarWind VM
$StarWindVM2 = "Starwind-VM (1)" #Name of second StarWind VM
$StarWind = "10.10.10.11" #IP address of one of StarWind VMs
$ESXIhost1 = "10.10.10.12" #Name of first ESXI Host
$ESXIhost2 = "10.10.10.13" #Name of second ESXI Host
try
{
    $password4vCenter = get-content C:\shutdown\vCenterCred.txt | convertto-securestring
}
catch
{
    Write-Host $_ -foreground red
    Add-Content $logfile "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) $_"
    exit
}
try
{
    $password4host = get-content C:\shutdown\vCenterCred.txt | convertto-securestring
}
catch
{
    Write-Host $_ -foreground red
    Add-Content $logfile "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) $_"
    exit
}
$tmp = get-content C:\Temp\HostsCred.txt | convertto-securestring
$password4Starwind = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto([System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($tmp)) 
$credentials = new-object System.Management.Automation.PSCredential $username, $password4vCenter
$credentials4host = new-object System.Management.Automation.PSCredential $username4host, $password4host
Write-Host ""
Write-Host "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) Shutdown command has been sent to the vCenter Server." -Foregroundcolor yellow
Write-Host "This script will shutdown all of the VMs and hosts located in $datacenter." -Foregroundcolor yellow
Write-Host ""
Sleep 5
Add-Content $logfile "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) PowerOff Script Engaged"
Add-Content $logfile ""
# Connect to vCenter
$counter = 0
if ($counter -eq 0){
       Set-PowerCLIConfiguration -InvalidCertificateAction ignore -Confirm:$false | Out-Null
}
Write-Host "Connecting to vCenter - $vcenter.... " -nonewline
Set-PowerCLIConfiguration -InvalidCertificateAction ignore -confirm:$false
Add-Content $logfile "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) Connecting to vCenter - $vcenter"
try
{
    $success = Connect-VIServer $vcenter -Credential $credentials -WarningAction:SilentlyContinue
}
catch
{
    Write-Host $_ -foreground red
    Add-Content $logfile "$(get-date -f dd/MM/yyyy) $(get-date -f HH:mm:ss) $_"
    exit
}

Ich habe den Anmeldebenutzer für diesen Dienst jedoch bereits auf den Benutzer geändert, der die verschlüsselten Anmeldeinformationen gespeichert hat. Es scheint, dass der Dienst immer noch nicht als der angegebene Benutzer ausgeführt wird oder dass es nicht möglich ist, diese sicheren Zeichenfolgen mit einem Windows-Dienst zu verwenden.

Wenn ich das Powershell-Skript aus der Powershell ISE ausführe, während ich mit diesem Benutzer angemeldet bin, wird das Skript ohne Fehler ausgeführt.

Wie kann ich in Powershell Anmeldeinformationen verwenden, die durch einen Windows-Dienst ausgelöst werden, ohne sie im Powershell-Skript im Klartext zu speichern?

Windows-Dienst mit bestimmtem Benutzer

verwandte Informationen