Invoke-VMScript: не подтверждать / повторно вводить учетные данные гостя

#powershell #powercli

#powershell #powercli

Вопрос:

Я выполняю аудит виртуальных машин в нашей среде и использую Invoke-VMScript для получения информации о диске:

 $vmErrors = New-Object System.Collections.Generic.List[System.Object]

$report = foreach ($VM in $VMs){
    $name = $vm.Name
    Write-Host "Retrieving data for $name... " -NoNewline
    try{
        $output = Invoke-VMScript -ScriptText @'
            Get-Disk | Foreach-Object{
                [PSCustomObject]@{
                    ComputerName   = $env:COMPUTERNAME
                    Number         = $_.number
                    Size           = [int]($_.size/1GB)
                    PartitionStyle = $_.PartitionStyle
                }
            } | ConvertTo-Csv -NoTypeInformation
'@ -VM $name -GuestUser $Username -GuestPassword $Password -WarningAction SilentlyContinue -ErrorAction Stop

        if($output.ScriptOutput -match 'PartitionStyle')
        {
            $output.ScriptOutput -replace '(?s)^. (?="Com)' | ConvertFrom-Csv
        }
        Write-Host "Done" -ForegroundColor Green
    }catch{
        $vmErrors.Add($name)
        Write-Host "Error!" -ForegroundColor Red
    }
}
 

При запуске кода в Powershell ISE мне не нужно подтверждать учетные данные для каждой виртуальной машины, и цикл скрипта работает отлично, однако, если я запускаю скрипт в стандартном окне Powershell, для каждой виртуальной машины я должен ввести имя пользователя и пароль для каждой виртуальной машины (учетные данные всегда будут одинаковымикак то, что я использую для аутентификации на сервере vCenter.
Пример:

 Retrieving data for VM NAME...
Specify Credential
Please specify guest credential
User:
 

Как я могу запустить это в обычном окне и избежать необходимости каждый раз повторно вводить свои учетные данные?

Редактировать

Пример установки имени пользователя и пароля:

 $Username = ""
$Password = ""
Function GetUser{
    do{
        $global:Username = Read-Host "What is your username? (DOMAINUsername)"
    }while($global:Username -eq "")
}

Function GetPassword{
    do{
        $global:Password = Read-Host "What is your password?" -AsSecureString
        $global:Password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($global:Password))
    }while($global:Password -eq "")
}
 

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

1. Вы не показываете, где вы заполняете $username и $password

2. Он устанавливается из пользовательского ввода. Обновленное сообщение

3. Вы устанавливаете $global:username, но затем ссылаетесь на $username (то же самое для пароля) Вы пробовали ссылаться на global?

4. О, ничего себе, это было так. Удивлен, что это было так просто.

5. Я бы рекомендовал нам просто полностью удалить это сообщение.

Ответ №1:

Решаемая путем изменения ссылок на учетные данные в Invoke-VMScript для использования $global:Username и $global:Password