首页 > 解决方案 > Invoke-VMScript:不确认/重新输入访客凭据

问题描述

我正在对我们环境中的虚拟机进行审计,并使用 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 中运行代码时,我不需要确认每个 VM 的凭据,并且脚本循环非常好,但是如果我在标准 Powershell 窗口中运行脚本,我必须为每个 VM 输入用户名和密码每个 VM(凭据将始终与我用于向 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? (DOMAIN\Username)"
    }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 "")
}

标签: powershellpowercli

解决方案


通过更改 Invoke-VMScript 中的凭据引用以使用$global:Username和解决$global:Password


推荐阅读