云计算运维

Windows Server 2003 - Windows Server 2019 系统工具,Linux系统脚本,Mysql、Nginx、PHP、Redis、K8S、Seafile、Weblogic 、Jenkins、DNS、DHCP、FTP、IIS、Zookeeper、Rabbitmq、Oracle、Tomcat、Mavrn等服务搭建维护,请关注我.

从指定用户组批量导出 AD域账户信息


1、文档概述

本文档面向系统管理员与运维人员,旨在指导如何从 Active Directory 域控制器中批量导出指定用户组的账户信息。文档核心内容包括一款自动化脚本的使用说明,该脚本可帮助管理员快速收集目标用户组下的域账号详细信息,从而显著提升日常运维工作效率。

2、适用范围

  • Active Directory域服务器
  • 域控运维管理人员
  • 收集指定组的用户信息
  • 快速、高效、准确

3、需求描述

权限审计,需要统计域账号拥有哪些用户组的权限。

例如,用户组分别有“购物网”、“财经网”、“远程软件”,需要统计哪些域账号有以上三个用户组的权限。

4、导出信息前准备工作

4.1域控服务器

系统名称 IP地址 部署链接
DC01(主域控) 192.168.11.201 企业AD域控服务器搭建链接
DC02(辅域控) 192.168.11.202

 

4.2用户组信息

表格用户组是本次需要收集的域用户账号的权限组信息。

组名 注释
购物网 允许上淘宝、京东等网站权限
财经网 允许上中国财经等网站权限
远程软件 允许使用向日葵等远程控制软件

 

4.3域用户账号信息

表格用户信息是本次需要收集的域账号属性信息。

字段名 例图
图片
显示名称
描述
办公室
电话号码
电子邮件

 

4.4信息收集脚本

红色字段是需要根据实际生产进行修改:

l用户组根据实际生产需求,需要导出哪个用户组的域账号信息,就填写哪个用户组的组名

l导出文件路径,可以根据实际需求进行修改

# 导入Active Directory模块

Import-Module ActiveDirectory

 

# 定义要查询的组

$Groups = @("购物网", "财经网","远程软件")

 

# 定义输出文件路径

$OutputPath = "C:\Export\GroupUsers_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"

 

# 确保输出目录存在

$OutputDir = Split-Path $OutputPath -Parent

if (!(Test-Path $OutputDir)) {

New-Item -ItemType Directory -Path $OutputDir -Force

}

 

# 收集所有用户信息

$AllUsers = @()

$GroupStats = @()

 

foreach ($Group in $Groups) {

Write-Host "正在处理组: $Group" -ForegroundColor Green

 

$GroupUserCount = 0

 

try {

# 获取组内的所有用户

$GroupMembers = Get-ADGroupMember -Identity $Group -Recursive |

Where-Object { $_.objectClass -eq 'user' }

 

Write-Host "  组 $Group 中找到 $($GroupMembers.Count) 个用户" -ForegroundColor Yellow

 

foreach ($Member in $GroupMembers) {

try {

# 获取用户的详细信息

$User = Get-ADUser -Identity $Member.SamAccountName -Properties *

 

# 获取用户所属的所有组

$UserGroups = (Get-ADUser -Identity $User.SamAccountName -Properties MemberOf).MemberOf |

ForEach-Object { (Get-ADGroup $_).Name } |

Where-Object { $Groups -contains $_ }

 

$GroupMembership = $UserGroups -join ";"

 

# 获取OU路径

$OUPath = ($User.DistinguishedName -replace ',CN=.*?,(.*)', '$1' -replace 'CN=.*?,', '') -replace ',', '/'

 

# 创建用户信息对象

$UserInfo = [PSCustomObject]@{

Name = $User.Name

FirstName = $User.GivenName

LastName = $User.Surname

SamAccountName = $User.SamAccountName

DisplayName = $User.DisplayName

Description = $User.Description

Office = $User.Office

PhoneNumber = $User.telephoneNumber

Email = $User.EmailAddress

OUPath = $OUPath

MemberOfGroups = $GroupMembership

}

 

$AllUsers += $UserInfo

$GroupUserCount++

Write-Host "    已处理用户: $($User.SamAccountName)" -ForegroundColor Gray

}

catch {

Write-Warning "无法获取用户 $($Member.SamAccountName) 的详细信息: $($_.Exception.Message)"

}

}

 

# 记录组统计信息

$GroupStats += [PSCustomObject]@{

GroupName = $Group

UserCount = $GroupUserCount

}

 

Write-Host "  组 $Group 处理完成,共导出 $GroupUserCount 个账号" -ForegroundColor Green

}

catch {

Write-Warning "无法处理组 $Group : $($_.Exception.Message)"

# 记录错误组的统计信息

$GroupStats += [PSCustomObject]@{

GroupName = $Group

UserCount = 0

Status = "Error: $($_.Exception.Message)"

}

}

 

Write-Host ""

}

 

# 去重(用户可能同时在两个组中)

$UniqueUserCount = ($AllUsers | Sort-Object SamAccountName -Unique).Count

$AllUsers = $AllUsers | Sort-Object SamAccountName -Unique

 

# 导出到CSV文件

$AllUsers | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8

 

# 显示统计信息

Write-Host "=" * 60 -ForegroundColor Cyan

Write-Host "导出统计信息:" -ForegroundColor Cyan

Write-Host "=" * 60 -ForegroundColor Cyan

 

foreach ($Stat in $GroupStats) {

if ($Stat.Status) {

Write-Host "组: $($Stat.GroupName) - 导出账号: $($Stat.UserCount) [错误: $($Stat.Status)]" -ForegroundColor Red

} else {

Write-Host "组: $($Stat.GroupName) - 导出账号: $($Stat.UserCount)" -ForegroundColor White

}

}

 

Write-Host "-" * 60 -ForegroundColor Cyan

Write-Host "去重后总用户数: $UniqueUserCount" -ForegroundColor Yellow

Write-Host "导出完成!文件保存在: $OutputPath" -ForegroundColor Green

 

# 显示前5行作为预览

Write-Host "`n前5行数据预览:" -ForegroundColor Magenta

$AllUsers | Select-Object -First 5 | Format-Table -AutoSize

 

# 显示重复用户信息(如果有)

$DuplicateUsers = $AllUsers | Group-Object SamAccountName | Where-Object { $_.Count -gt 1 }

if ($DuplicateUsers.Count -gt 0) {

Write-Host "`n注意: 发现以下用户在多个组中存在(已自动去重):" -ForegroundColor Yellow

$DuplicateUsers | ForEach-Object {

$UserGroups = ($_.Group.MemberOfGroups | Select-Object -Unique) -join ", "

Write-Host "  $($_.Name) - 所属组: $UserGroups" -ForegroundColor Yellow

}

}

 

5、导出信息过程

将批量导出指定用户组的域账户信息的PowerShell脚本,放置域控服务器C盘的根目录下,如图所示:

图片

以管理员身份运行PowerShell,如图所示:

图片

切换到C盘根目录,如图所示:

>cd C:\

图片

执行脚本,如图所示:

图片

脚本执行完毕,显示执行完的结果,如图所示:

图片

6、查看结果

打开导出的域账号信息表:

图片

至此,收集指定用户组的域账号信息操作全部完成,最终结果如下图所示:

图片

  • 分享: