Import-Module ActiveDirectory
Get-ADComputer -Filter {enabled -eq $true} -properties *|select Name,
| Out-File -FilePath c:\Powershell.txt我正在尝试将列表导出到txt文件,并让它按名称显示我的域中所有计算机的列表以及它所分配到的OU或组。我可以用这个来检索名称,但我想添加一个OU列。
发布于 2021-03-11 00:37:47
由于RDN值包含OU,因此我们可以使用一些字符串拆分魔术来提取它:
Get-ADUser -Filter * |Select Name,@{Name='OU';Expression={$_.DistinguishedName -split '(?<!\\),' |Select -Index 1}}这将只给我们提供RDN (即OU=Company Users),如果需要OU的完整DN,请执行以下操作:
Get-ADUser -Filter * |Select Name,@{Name='OU';Expression={$_.DistinguishedName -split '(?<!\\),',2 |Select -Skip 1}}只有在前面没有\的情况下,模式(?<!\\),才会匹配DN中的任何, -这是为了避免对转义的,进行拆分,就像在CN=LastName\, FirstName,OU=Users,...中一样
发布于 2021-03-11 00:37:48
老实说,我会从DistinguishedName值派生OU。这将比运行额外的ActiveDirectory模块PowerShell命令更快。然后,您可以使用Select-Object's calculated properties输出OU值。我还建议输出到CSV (使用Export-Csv),因为这种格式很容易被PowerShell和其他文件编辑工具读取。
Get-ADComputer -Filter 'Enabled -eq $true' |
Select-Object Name,@{n='OU';e={$_.DistinguishedName -creplace '^.*?,(?=[A-Z]{2}=.*)'}} |
Export-Csv -Path c:\Computers.csv请注意,CSV导出将有一个标题行,值将由逗号分隔。如果您喜欢使用不同的分隔符,则可以使用-Delimiter参数或PowerShell会话的默认列表分隔符和-UseCulture开关。
-creplace是-replace运算符的区分大小写版本。
^.*?,(?=[A-Z]{2}=.*)是正则表达式语法,用于匹配要替换的文本。^表示字符串的开头。在匹配,之前,.*?,会尽可能地匹配几个字符。但是因为CN值可以包含,字符,所以我们只想在它位于OU=或DC=之前时停止匹配。这就是为什么我们有积极的前瞻(?=[A-Z]{2}=.*)。[A-Z]{2}恰好匹配后面跟着=的两个大写字母。
发布于 2021-03-11 01:09:50
这就是我所做的,它比提供的其他示例慢一点,但它将防止Get-ADcomputer cmdlet上的任何超时。我还使用CanonicalName来获得OU的绝对路径,因为OU可以具有相同的名称,并且规范比区分更容易阅读。
$Result=New-Object System.Collections.ArrayList
$OUs=Get-ADOrganizationalUnit -Filter * -Properties CanonicalName
foreach($OU in $OUs)
{
$hash=@{
Filter='Enabled -eq $true'
SearchScope='OneLevel'
SearchBase=$OU.DistinguishedName
}
$computers=Get-ADComputer @hash
foreach($computer in $computers)
{
$Result.Add(
[pscustomobject]@{
ComputerName=$computer.Name
OU=$OU.CanonicalName
}) > $null
}
}https://stackoverflow.com/questions/66568822
复制相似问题