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