列而不是行中的 Powershell 脚本

Powershell script in columns instead of rows

我正在尝试编写一个脚本,该脚本将使用带有主机名的文本文件,并且需要生成一个包含额外数据的文件。我只能设法在行而不是列中获取它:

Model: 
Bios Version: 
TPM OEM Ver: 
User logged In:

我还想从登录用户那里获取电子邮件地址。我正在考虑使用 get-aduser。我可以在当前代码之后使用带有用户名的列添加另一个 foreach 吗?我该怎么做? 非常感谢所有帮助!

我的代码是:

$output = foreach ($hostname in Get-Content C:\temp\hostnames.txt)
{
$computerinfo = get-ciminstance -computername $hostname Win32_ComputerSystem
$computerBIOS = get-ciminstance -computername $hostname Win32_BIOS
$tpm = Get-ciminstance -class Win32_Tpm -namespace root\CIMV2\Security\MicrosoftTpm -ComputerName $hostname
"Hostname: " + $computerinfo.name
"Model: " + $computerinfo.Model 
"Bios Version: " + $computerBIOS.smbiosbiosversion
"TPM OEM Ver: " + $tpm.ManufacturerVersion
"User logged In: " + $computerinfo.UserName
} 
$output | out-file 'C:\Temp\hostnames3.txt' -append

对于结构化数据,您应该使用 CSV 文件格式而不是纯文本格式。这使得在需要时更容易将它们用于进一步的步骤。

$output = 
foreach ($hostname in Get-Content C:\temp\hostnames.txt) {
    $computerinfo = Get-CimInstance -ComputerName $hostname -ClassName Win32_ComputerSystem
    $computerBIOS = Get-CimInstance -ComputerName $hostname -ClassName Win32_BIOS
    $tpm = Get-CimInstance -Namespace root\CIMV2\Security\MicrosoftTpm -ComputerName $hostname -ClassName Win32_Tpm
    [PSCustomObject]@{
        Hostname       = $computerinfo.name
        Model          = $computerinfo.Model
        Bios_Version   = $computerBIOS.smbiosbiosversion
        TPM_OEM_Ver    = $tpm.ManufacturerVersion
        User_logged_In = $computerinfo.UserName
    }
} 
$output | 
    Export-Csv -Path 'C:\Temp\hostnames3.csv' -NoTypeInformation

根据我的经验,CIM-Class Win32_ComputerSystemUserName 属性 无法可靠地确定登录用户。我通常像这样使用旧 quser.exe

$UserQuery = ( C:\Windows\System32\quser.exe /server:$hostname 2> null)
        if ($UserQuery) {
            $UserQuery[1].Trim() -match "^(\S+)\s+.*((\d{2}\.){2}\d{4}\s+\d{2}:\d{2})" | Out-Null
            $LoggedOnUser = $Matches[1]
            $LogonTime = Get-Date -Date $Matches[2]
        }

然后您可以根据需要使用$LoggedOnUser$LogonTime 将其包含在您的输出对象中。

当然,您可以包含一个额外的 AD 查询,以获取有关登录用户的更多信息。