我正在尝试编写一个脚本,该脚本将使用带有主机名的文本文件,并且需要生成一个包含额外数据的文件。我只能在行而不是列中获取它:
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类UserName
的Win32_ComputerSystem
属性无法确定已登录的用户。我通常像这样使用旧的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查询,以获取有关登录用户的更多信息。