Более чистый способ экспорта имен - PullRequest
0 голосов
/ 26 марта 2019

Когда я экспортирую данные моей группы из exchange / AD, у меня остается полное доменное имя, включая CN =, OU =, OU =, ect.Есть ли что-то, что я могу изменить в своем скрипте, чтобы заставить его экспортировать только имя, вместо того, чтобы идти в Excel, искать и заменять то, что я не хочу?

#Written by Tekwhat 10-26-17
write-host "Group Memberships"
#Settings for file ouput
$fLocation = "D:\Exchange Reports\O365 Reports\"

import-module activedirectory

#Get OU
$OU = Read-Host -Prompt "Input the OU name to search: (0202 - Dev Bank)"

#create File to write report to:
$fName = $fLocation+$OU+" Group Memberships.csv"
$test = test-path $fName
    if ($test -eq $True)
        {
            write-host "Removing Old File..." -ForeGroundColor Red
            Remove-Item $fName
        }
    #Else
        #{
            #New-Item $fName -type file
        #}
Write-host "Creating New File..." -ForeGroundColor darkgreen
New-Item $fName -type file


$SearchBase = "OU=$OU,OU=Hosted Exchange Customers,DC=Domain,DC=local"
$ADGroups = Get-ADGroup -Filter * -SearchBase $SearchBase | % { [ADSI]("LDAP://$_") }
 
$Members = @()
 
foreach ($ADGroup in $ADGroups){
              $Members += $ADGroup.Member |
                           Select -Property @{Name="ADGroup";Expression={$ADGroup.cn}},
                           @{Name="Member";Expression={$_}}
}
 

$Members | Select-Object AdGroup, Member | Export-Csv -Path $fname -NoType
write-host "Your file is located at " $fname -ForegroundColor DarkGreen

Экспорт выше дает что-то вродеthis:

«Все сотрудники», «CN = Test X User, OU = OUname, OU = Hosted Exchange Customers, DC = Домен, DC = local»

Который я должен пойти в Excel и искать заменить «CN =» и «OU = OUname, OU = Hosted Exchange Customers, DC = Domain, DC = local», чтобы иметь пригодные для использования данные.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Похоже, что вы перестали проектировать это, основываясь на своей конечной цели. Поправь меня, если я ошибаюсь. Тем не менее, при взгляде на ваш код и вашу конечную цель, я бы взял это на себя.

По умолчанию не требуется Write-Host (кроме цветных) просто для отправки на экран (Write-Output), поэтому вам не нужно специально это записывать, но это выбор стиля.

"Create OU based Group Memberships Report"

$fLocation = 'C:\Temp'

# no need to do this as modules are auto imported since v3, but it does not hurt to have it here
# Import-Module -Name ActiveDirectory

# Use a GUI to provide an OU list to select from.
$OUName = Get-ADOrganizationalUnit -Filter '*' | 
Select-Object -Property Name, DistinguishedName | 
Out-GridView -Title 'Select the OU name to search' -PassThru

# Set a file name to use. 'spaces in files names are just bad', so remove them
$fName = "$(($OUName).Name)_OU_ADGroup_Membership.csv" -replace ' '

# Remove any report of the same name
If(Test-Path -Path "$fLocation\$fName")
{ 
    Write-Warning -Message "A previous version of the report file is in the destination folder. Removing the file!"
    Remove-Item -Path "$fLocation\$fName" -Force
}

# Collect OU, AD group and user data and create a new CSV file
Get-ADOrganizationalUnit -Identity $OUName.DistinguishedName | 
ForEach{
    Get-ADGroup -Filter * -SearchBase $PSItem | 
    ForEach{
        $ADGroup = $PSItem.Name
        Get-ADGroupMember -Identity $ADGroup | 
        Select-Object @{Name = 'GroupName';Expression = {$ADGroup}}, 
        Name, SamAccountName | 
        Export-Csv -Path "$fLocation\$fName" -NoTypeInformation -Append
    }
}

Write-Host "Your new report file is licated here: $fLocation\$fName" -ForegroundColor Yellow
Import-Csv -Path "$fLocation\$fName"

#Results

WARNING: A previous version of the report file is in the destination folder. Removing the file!
Your new report file is licated here: C:\Temp\LabUsers_OU_ADGroup_Membership.csv

GroupName                   Name                  SamAccountName
---------                   ----                  --------------
...                                                  
TestUsers                   Test User001          testuser001
...
1 голос
/ 26 марта 2019

Я прошу прощения, если я ошибаюсь, но я полагаю, что у вас есть проблемы с выводом свойства элемента. Вы можете использовать что-то вроде следующего:

$SearchBase = "OU=$OU,OU=Hosted Exchange Customers,DC=Domain,DC=local"
$ADGroups = Get-ADGroup -Filter * -SearchBase $SearchBase -Properties Member,CN

$Members = @()
foreach ($ADGroup in $ADGroups){
    $Members += $ADGroup.Member |
        Select -Property @{Name="ADGroup";Expression={$ADGroup.cn}},
        @{Name="Member";Expression={($_ | Select-String -pattern "(?<=CN=).*?(?=,OU=|,DC=)").matches.value}}
}

Одним из возможных эффектов приведенного выше кода является то, что у вас будут дублирующиеся имена групп ADG для каждого участника. Если это не предназначено, то все должно быть изменено.

Я сохранил большую часть вашего кода, поэтому я объясню, что я изменил:

($_ | Select-String -pattern "(?<=CN=).*?(?=,OU=|,DC=)").matches.value

  • $_ относится к текущему объекту конвейера с $ADGroup.Member
  • Select-String выбирает строку из входных данных конвейера на основе совпадения с регулярным выражением в этом случае. Текст регулярного выражения передается параметру -pattern.
  • "(?<=CN=).*?(?=,OU=|,DC=)" - регулярное выражение (регулярное выражение).
    • (?<=CN=): (?<=) - это механизм позитивного просмотра, который ищет строку CN= позади текущей позиции в матче.
    • .*? соответствует как можно меньшему числу символов (.), за исключением символов новой строки
    • (?=,OU=|,DC=) использует механизм положительного просмотра ((?=)), чтобы найти строку ,OU= или (|) строку ,DC=.
  • .Matches является свойством Matches вывода Select-String. Он содержит другие свойства, которые полезны для указания групп захвата регулярных выражений или выбора из нескольких совпадений. Одним из таких свойств является value, которое содержит фактическое совпадение строки.
  • Механизмы прогнозирования и прогнозирования не фиксируют совпадения. Они просто позиционируют, чтобы контролировать, где вы находитесь в последовательности матчей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...