我一直试图解决这个问题很长一段时间。我的最终目标是将导出的报告作为单个csv表。但是,我一直非常不成功。然后我将其分解为导出2张我可以合并的页面,然而,CIM根本就没有打好。然后我的另一个问题是没有正确地从我的列表中调用。
$ComputerList = "C:\ps_test\pclastlogon.txt"
$LogPath = "C:\ps_test\Logs"
$LogTime = Get-Date -Format s | foreach {$_ -replace ":", "-"}
$CsvLogonPath = $LogPath+'\RebootStatus-'+$LogTime+'-Logon.csv'
$CsvBootPath = $LogPath+'\RebootStatus-'+$LogTime+'-LastBoot.csv'
Import-Module ActiveDirectory
IF ( -Not (Test-Path -Path $LogPath)) {New-Item -Path $LogPath -ItemType Directory}
$Computers = Get-Content $ComputerList
Foreach ($Computers in $ComputerList) {
Get-ADComputer -Identity $Computers -Properties * -Filter * | Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}} | Export-Csv -Path $CsvLogonPath
}
Foreach ($Computers in $ComputerList) {
Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select csname,LastBootUpTime | Export-Csv -Path $CsvBootPath
}
有人可以指出我正确的方向吗?提前谢谢。
答案 0 :(得分:1)
不使用-filter * -Properties *,它太贵了。在-Properties
中提及所需的属性,如果您提到-Identity
,则不一定需要-filter *
。
将Get-ADComputer
和Get-CimInstance
换成一个foreach
并创建一个CustomObject,然后导出为CSV。
[未经测试] 例如:
$AllDetails = Foreach ($Computers in $ComputerList) {
$DetailsfromAD = Get-ADComputer -Identity $Computers -Properties cn,LastLogonDate,LastLogon | Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}}
$DetailsFromCIM = Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select csname,LastBootUpTime
$PropertyHash = @{
CN = $DetailsfromAD.CN
LastLogonDate = $DetailsfromAD.LastLogonDate
'Last Logon' = $DetailsfromAD.'Last Logon'
csname = $DetailsFromCIM.csname
LastBootUpTime = $DetailsFromCIM.LastBootUpTime
}
New-Object -TypeName PSObject -Property $PropertyHash
}
将$AllDetails
导出为CSV文件
答案 1 :(得分:0)
这里只是一个猜测,但在管道之后,我认为你需要为每个你的命令列表。像
这样的东西Get-ADComputer -Identity $Computers -Properties * -Filter * | % { Select-Object cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}} | Export-Csv -Path $CsvLogonPath }
但是你需要做一些事情来追加每个结果,而不是仅仅在$CSvLogonPath
答案 2 :(得分:0)
连接由单个源列表产生的两个对象列表的一般方法:
使用$Computers
在两个对象列表中将原始计算机列表($ComputerList
)中的计算机名称(@{Label="ComputerName"; Expression={$Computers}}
)添加为主键:
$ADComputers = Foreach ($Computers in $ComputerList) {
Get-ADComputer -Identity $Computers -Properties * -Filter * | Select-Object @{Label="ComputerName"; Expression={$Computers}},cn,LastLogonDate,@{LABEL="Last Logon";EXPRESSION={[DateTime]::FromFileTime($_.LastLogon)}}
}
$CimInstances = Foreach ($Computers in $ComputerList) {
Get-CimInstance Win32_OperatingSystem -ComputerName $Computers | Select @{Label="ComputerName"; Expression={$Computers}},csname,LastBootUpTime
}
使用Join-Object
功能加入ComputerName
上的对象列表:
$ADComputers | Join $CimInstances -On ComputerName | Export-Csv -Path $CsvBootPath
您可能会考虑轻松做到这一点而忘记主键,只需根据其索引加入两个表:
$ADComputers | Join $CimInstances -Using {$LeftIndex -eq $RightIndex}
但我建议不要这样做,因为如果你的某个表缺少一条记录(例如因为它不存在数据库),索引可能会错误对齐。