我正在试图找出Powershell脚本的正确编码。 我希望它看到我们所有的域控制器,并使用最新的lastlongondate。 它有数据后,我希望它通过操作系统分类,所以它会说Windows 10 – 100服务器2008 – 10前….我似乎无法弄清楚如何得到它来检查所有的控制器的适当的数据。 这是我迄今为止。 有没有人看到我在做什么错了?
#Functions function ImportADModule { Import-Module ActiveDirectory if (!($?)) { Add-WindowsFeature RSAT-AD-PowerShell Import-Module ActiveDirectory } } function GetDN { param($domain) $names = $domain.Split(".") $bFirst = $true foreach ($name in $names) { if ($bFirst) { $dn += "DC=" + $name $bFirst = $false } else { $dn += ",DC=" + $name } } return $dn } function GetDNs { param($domains) $dns = @{} foreach ($domain in $domains) { $dns.Add($domain, (GetDN -domain $domain)) } return $dns } function GetOSCountsPerDomain { param($dns, $enabled, $daysOld) $osCounts = @{} $cutOffDate = ((Get-Date).Adddays(-($daysOld))).ToFileTime() Write-Host "Getting Data" -NoNewline -ForegroundColor Yellow $filter = "(PwdLastSet -gt {0}) -and (Enabled -eq '{1}')" -f $cutOffDate, $enabled foreach ($domain in $dns.GetEnumerator()) { $i = 0 $domains = @{} Write-Host "." -NoNewline -ForegroundColor Yellow $computers = Get-ADComputer -Filter $filter -SearchBase $domain.Value -Server $domain.Key -Properties OperatingSystem foreach ($computer in $computers) { if ($computer.OperatingSystem -eq $null) { $os = 'NULL'} else { $os = $computer.OperatingSystem } try { $domains.Add(($os + " - " + $osver), 1) } catch { $domains.Set_Item(($os + " - " + $osver), ($domains.Get_Item($os + " - " + $osver))+1) } } $osCounts.Add($domain.Key, $domains) } Write-Host return $osCounts } function DisplayOutput { param($osCounts) Write-Host foreach ($osCount in $osCounts.GetEnumerator()) { Write-Host $OSCount.Key -ForegroundColor Green $osCount.Value.GetEnumerator() | Sort-Object Value -Descending | Format-Table -AutoSize } } #Main #Import AD Module for PowerShell ImportADModule #Get list of domains from current forest $Domains = (Get-ADForest).domains #Get hash table of domains and distinguished names from current forest $DNs = GetDNs -domains $Domains #Get OS counts per domain (specify age here) $OSCounts = GetOSCountsPerDomain -dns $DNs -enabled $true -daysOld 7 #Display Results $Body = DisplayOutput -osCounts $OSCounts #Send email settings $email = @{ From = "email" To = "email" Subject = "Operating System Counts" SMTPServer = "mail.mail.org" Body = $body| Out-String } send-mailmessage @email
下面应该做你正在寻找的东西。 我没有添加“发送电子邮件”部分。 只是回答你的具体问题,围绕域控制器和他们的计数。
$domaincontrollers = Get-ADDomainController $dcinfo = foreach($computer in $domaincontrollers) { Get-Adcomputer -Identity $computer.Name -Properties LastLogonDate,OperatingSystem } $dcinfo | Group-Object OperatingSystem
更新 – 重新读你的问题,我不知道如果你想从最后logindate的域控制器的所有计算机。 如果是这样的话,为了让域控制器获得最后一次logindate,然后从该服务器获取所有计算机,可以使用下面的方法。 感谢这个链接 。
$domaincontrollers = Get-ADDomainController $lastlogondomaincontroller = $domaincontrollers | Foreach-Object {$_.LastLogonDate = $_.LastLogonDate; $_} | ` Group-Object Name | ` Foreach-Object {$_.Name | Sort-Object LastLogonDate | Select-Object -Last 1} Get-Adcomputer -Filter * -Server $lastlogondomaincontroller -Properties LastLogonDate,OperatingSystem | Group-Object OperatingSystem
更新2 – 评论后。
$domaincontrollers = (Get-ADForest).Domains | ForEach-Object { Get- ADDomainController -Filter * -Server $_ } $allcomputersfromalldcs = foreach($computer in $domaincontrollers) { Get-Adcomputer -filter * -server $computer.Name -Properties LastLogonDate,OperatingSystem } $uniquecomputers = $allcomputersfromalldcs | Select-Object Name,OperatingSystem,LastLogonDate | Sort-Object Name,LastLogonDate | Select-Object Name,OperatingSystem,LastLogonDate -Unique $uniquecomputers | Group-Object OperatingSystem
更新2答案获得所有的DC,然后检查每个DC上的所有计算机。 因为会有复制的机器,$ uniquecomputers把所有的计算机,按名称和lastlogondatesorting。 然后我使用-Unique检索一个单一的机器名称。
然后可以使用Group-Object来获取值。 如果你想要的电子邮件的实际数字,你可以使用
$uniquecomputers | Group-Object OperatingSystem | Select-Object Count,OperatingSystem
我已经将variables存储在variables中,以便您可以根据需要将它们用于您的电子邮件。
希望这是你正在寻找的。
谢谢,Tim。