PowerShell中如何在Select/Group命令中提取子字符串
从AD用户userPrincipalName提取前缀代码并导出登录日志脚本修改
我们需要处理AD用户的userPrincipalName字段:该字段格式类似LLL_John.Smith@email.com或XXXX_Jane.Doe@email.com时,提取下划线_之前的前缀代码(如LLL、XXXX);对于不含下划线的条目则直接忽略。以下是初始脚本和修改后的完整实现脚本:
初始脚本
##请查看脚本底部设置指定OU Function Get-LastLogon { param( [string]$OUName ) # 获取所有层级中匹配的OU $OUs = Get-ADOrganizationalUnit -Filter "Name -like '$OUName'" $DCs = Get-ADDomainController -Filter * # 从每个DC的每个OU中获取所有用户 $ADUsers = Foreach ($OU in $OUs) { Foreach ($DC in $DCs.HostName) { Get-ADUser -SearchBase $OU.DistinguishedName -Filter * -Properties LastLogon -server $dc | Select-Object Name,userPrincipalName, @{n='LastLogon';e={[DateTime]::FromFileTime($_.LastLogon)}} } } # 返回每个用户最新的LastLogon日期 $ADUsers | Group Name,userPrincipalName | Select Name,userprinciplename, @{n='LastLogon';e={$_.Group.LastLogon | sort -desc | select -First 1}} } ## 函数结束 ##在此输入OU名称 Get-LastLogon -OUName 'Clients' ##取消注释以下代码可导出到CSV ## | Export-Csv -Path 'C:\temp\UserExport.csv'
修改后的完整脚本
##请查看脚本底部设置指定OU Function Get-LastLogon { param( [string]$OUName ) # 获取所有层级中匹配的OU $OUs = Get-ADOrganizationalUnit -Filter "Name -like '$OUName'" $DCs = Get-ADDomainController -Filter * $ADUsers = foreach ($OU in $OUs) { foreach ($dc in $DCs.HostName) { Get-ADUser -SearchBase $OU.DistinguishedName -Filter * -Properties lastLogonTimeStamp -Server $dc | Select-Object Name,UserPrincipalName, @{Name = 'LastLogon';Expression = {[DateTime]::FromFileTime($_.lastLogonTimeStamp)}}, @{Name = 'UserCode'; Expression = {([regex]'^([^_]+)_.*').Match($_.UserPrincipalName).Groups[1].Value}} } } } # 返回每个用户最新的LastLogon日期 # 仅保留userPrincipalName中包含前缀代码的用户 $ADUsers | Where-Object { ![string]::IsNullOrWhiteSpace($_.UserCode) } | Group-Object UserPrincipalName | ForEach-Object { [PsCustomObject]@{ Name = $_.Group[0].Name UserCode = $_.Group[0].UserCode LastLogon = $_.Group.LastLogon | Sort-Object -Descending | Select-Object -First 1 } } ## 函数结束 $OUcustom = Read-Host -prompt '请输入OU名称,或输入"Clients"获取全部' ##执行函数并导出结果 Get-LastLogon -OUName $OUcustom | Export-Csv -path "C:\temp\UserExport_$((Get-Date).ToString("ddMM_HHmm")).csv" -NoTypeInformation ".csv文件已导出到C:\temp" pause
内容的提问来源于stack exchange,提问作者Steve101
相关产品推荐
相关产品推荐

