Powershell 多凭据设置

Powershell multiple credential setup

我刚刚设置了一个 powershell 来收集一组服务器中的磁盘 space 信息。 但我遇到一个问题,当我尝试从一台服务器到另一台服务器进行身份验证时,它需要不同的凭据信息。

例如 SQLServer01

ID: domain1\sqladmin1

PW: 123456

SQLServer02

ID: domain2\sqladmin2

PW: 654321

现在我设法设置了第一个功率有限的-shell经验。

$comp= Get-Content "C:\disk_info\Computers.txt"
$diskvalue = @()
#$cre = get-Credential

$username = "domain1\sqladmin1"
$password = "123456"
$secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force 
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $secureStringPwd



foreach($pc in $comp)
{
    $diskvalue += Get-WmiObject -Class Win32_logicaldisk -ComputerName $pc -credential $creds -Filter DriveType=3 | 
    Select SystemName , DeviceID , @{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}}, @{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}}, @{Name=”UsedSpace(GB)”;Expression={“{0:N2}” -f(($_.size - $_.FreeSpace)/1gb)}}
    #$diskvalue -replace ":",""
    $diskvalue | Export-Csv C:\disk_info\DiskReport.csv -NoTypeInformation
    
}

但我正在尝试为某些服务器输入另一个凭据。 domain2\ 在这种情况下。

Computer.txt作为参考

sqlserver1.domain1.com 
sqlserver2.domain1.domain2.com 
sqlserver3.domain1.com

包含“domain2”的那个将需要多个凭据。

如果您在 Computers.txt 中使用机器的完全限定域名,您可以使用简单的 if 语句来决定使用哪个域凭据。您只需要在下面的脚本 ($domain2Match='.domain1.domain2.com') 中将顶部的 $domain2Match 变量更改为您的第二个域。

$comp= Get-Content "C:\disk_info\Computers.txt"
$diskvalue = @()

# Put your FQDN without the server name here for the seconded domain
$domain2Match = '.domain1.domain2.com' 

# Credential 1
$username = "domain1\sqladmin1"
$password = "123456"
$secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force 
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $secureStringPwd

# Credential 2   
$username2 = "domain2\sqladmin2"
$password2 = "123456"
$secureStringPwd2 = $password2 | ConvertTo-SecureString -AsPlainText -Force 
$creds2 = New-Object System.Management.Automation.PSCredential -ArgumentList $user2, $secureStringPwd2


foreach($pc in $comp)
{
    $credsToUse = $null

    If($pc -imatch $domain2Match){
        # Matched use domain 2 Credential
        $credsToUse = $creds2 
    }Else {
        # No match use domain 1 Credential
        $credsToUse = $creds
    }

    $diskvalue += Get-WmiObject -Class Win32_logicaldisk -ComputerName $pc -credential $credsToUse -Filter DriveType=3 | 
    Select SystemName , DeviceID , @{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}}, @{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}}, @{Name=”UsedSpace(GB)”;Expression={“{0:N2}” -f(($_.size - $_.FreeSpace)/1gb)}}
    $diskvalue | Export-Csv C:\disk_info\DiskReport.csv -NoTypeInformation
}

您可以创建两个 Credenital 对象:

信誉 1

$username = "domain1\sqladmin1"
$password = "123456"
$secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force 
$creds = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $secureStringPwd

信誉 2

$username = "domain2\sqladmin2"
$password = "123456"
$secureStringPwd = $password | ConvertTo-SecureString -AsPlainText -Force 
$creds2 = New-Object System.Management.Automation.PSCredential -ArgumentList $user, $secureStringPwd

然后使用 IF 语句和 splatting 参数(会更容易和更清晰)

foreach($pc in $comp)
{

$Params = @{
Class = "Win32_logicaldisk"
ComputerName = $pc
Credential = $creds
Filter = 'DriveType=3' 
}

If ($pc -eq "SQLServer02")
{
$Params["Credential"] = $creds2
}
    $diskvalue += Get-WmiObject @Params | Select SystemName , DeviceID , @{Name=”size(GB)”;Expression={“{0:N1}” -f($_.size/1gb)}}, @{Name=”freespace(GB)”;Expression={“{0:N1}” -f($_.freespace/1gb)}}, @{Name=”UsedSpace(GB)”;Expression={“{0:N2}” -f(($_.size - $_.FreeSpace)/1gb)}}
    #$diskvalue -replace ":",""
    $diskvalue | Export-Csv C:\disk_info\DiskReport.csv -NoTypeInformation

  }