Active Directory (AD)是微软开发的目录服务,用于存储和管理网络资源信息。国家/地区信息是AD中用户对象的一个属性,通常存储在country
或co
属性中。
# 首先需要安装Active Directory模块
Import-Module ActiveDirectory
# 获取所有用户的country属性并去重
$countries = Get-ADUser -Filter * -Properties Country |
Where-Object { $_.Country } |
Select-Object -ExpandProperty Country -Unique |
Sort-Object
# 输出结果
$countries
# 获取AD中预定义的国家/地区代码
$schema = Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext -Filter { lDAPDisplayName -eq "countryCode" } -Properties attributeSyntax, oMSyntax, searchFlags, attributeTypes
# 解析国家/地区代码
$countryCodes = $schema.attributeTypes -split '\n' |
Where-Object { $_ -match "countryCode" } |
ForEach-Object {
if ($_ -match '\((\d{3})\)') {
[PSCustomObject]@{
Code = $matches[1]
Name = ($_ -split 'DESC ')[1] -replace '\)', '' -replace "'", ""
}
}
}
# 输出结果
$countryCodes | Sort-Object Name | Format-Table -AutoSize
# 创建一个简单的ISO国家/地区代码映射
$isoCountries = @{
"US" = "United States"
"GB" = "United Kingdom"
"CN" = "China"
"JP" = "Japan"
"DE" = "Germany"
# 可以添加更多国家/地区代码
}
# 输出结果
$isoCountries.GetEnumerator() | Sort-Object Value | Format-Table -AutoSize
原因:未安装Active Directory模块 解决:
# 在Windows服务器上安装AD模块
Add-WindowsFeature RSAT-AD-PowerShell
# 或者使用ADSI替代方法
$searcher = [ADSISearcher]"(objectClass=user)"
$searcher.PropertiesToLoad.Add("country")
$results = $searcher.FindAll()
$countries = $results | ForEach-Object { $_.Properties["country"] } | Where-Object { $_ } | Select-Object -Unique
$countries
原因:未过滤空值和去重
解决:使用Where-Object
和Select-Object -Unique
过滤结果
原因:查询所有用户可能导致性能问题 解决:
# 使用分页查询
$pageSize = 1000
$offset = 0
$countries = @()
do {
$users = Get-ADUser -Filter * -Properties Country -ResultSetSize $pageSize -ResultPageOffset $offset
$batchCountries = $users | Where-Object { $_.Country } | Select-Object -ExpandProperty Country -Unique
$countries += $batchCountries
$offset += $pageSize
} while ($users.Count -eq $pageSize)
$countries = $countries | Sort-Object -Unique
以上方法可以根据实际AD环境的具体需求进行调整和组合使用。
没有搜到相关的文章