You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 12:55:18