Получить атрибуты Active Directory для пользователей на устаревших серверах Exchange - PullRequest
1 голос
/ 17 марта 2010

Я хотел бы создать CSV-файл пользователей на наших серверах Exchange 2003 и включить некоторые атрибуты из их учетной записи AD. В частности, я хотел бы получить определенные значения AD для пользователей с RecipientTypeDetails = LegacyMailbox.

Я пробовал несколько разных методов нацеливания и фильтрации (ldapfilter, filter, objectAttribute и т. Д.) Для этих пользователей, но без особого успеха. Exchange 2003 PowerPack for PowerGUI был полезен, но проблемы с разрешениями и использование класса Exchange_Mailbox не являются проблемами, которые я хочу преодолеть.

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

$ADproperties = 'City','Company','department','Description','DistinguishedName','DisplayName','FirstName','l','LastName','msExchHomeServerName','NTAccountName','ParentContainer','physicaldeliveryofficename','SamAccountName','useraccountcontrol','UserPrincipalName'
get-user -ResultSize Unlimited -ignoredefaultscope -RecipientTypeDetails LegacyMailbox | foreach {Get-QADUser $_.name -DontUseDefaultIncludedProperties -IncludedProperties $ADproperties} | select $ADproperties | epcsv C:\UserListBuilder\exchUsers.csv -notype

Любая помощь, которую вы можете оказать, будет принята с благодарностью!

1 Ответ

0 голосов
/ 18 марта 2010

Я решил эту проблему, используя уже созданный скрипт, который объединяет файл CSV с атрибутами из AD. По сути, я использовал Get-Mailbox для генерации списка CSV всех пользователей Exchange 2003, а затем использовал этот список в качестве входных данных для Get-QADuser, чтобы получить нужные мне атрибуты AD, и не смог использовать другие командлеты. Функции Merge-Object и Export-CSV были найдены другими пользователями в Интернете, обе очень удобные функции. Ниже приведена копия сценария:

Function Merge-Object($Base, $Additional)
{
ForEach ($Property in $($Additional | Get-Member -Type Property, NoteProperty))
{
    $Base | Add-Member -MemberType NoteProperty -Name $Property.Name -Value $Additional.$($Property.Name) -ErrorAction SilentlyContinue
}
Return $Base
}
Function Export-CSV
{
[CmdletBinding(DefaultParameterSetName='Delimiter',
SupportsShouldProcess=$true, ConfirmImpact='Medium')]
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true)]
[System.Management.Automation.PSObject]
${InputObject},

[Parameter(Mandatory=$true, Position=0)]
[Alias('PSPath')]
[System.String]
${Path},

#region -Append (added by Dmitry Sotnikov)
[Switch]
${Append},
#endregion 

[Switch]
${Force},

[Switch]
${NoClobber},

[ValidateSet('Unicode','UTF7','UTF8','ASCII','UTF32','BigEndianUnicode','Default','OEM')]
[System.String]
${Encoding},

[Parameter(ParameterSetName='Delimiter', Position=1)]
[ValidateNotNull()]
[System.Char]
${Delimiter},

[Parameter(ParameterSetName='UseCulture')]
[Switch]
${UseCulture},

[Alias('NTI')]
[Switch]
${NoTypeInformation})

begin
{
# This variable will tell us whether we actually need to append
# to existing file
$AppendMode = $false

try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
{
    $PSBoundParameters['OutBuffer'] = 1
}
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Export-Csv',
    [System.Management.Automation.CommandTypes]::Cmdlet)


    #String variable to become the target command line
    $scriptCmdPipeline = ''

    # Add new parameter handling
    #region Dmitry: Process and remove the Append parameter if it is present
    if ($Append) {

        $PSBoundParameters.Remove('Append') | Out-Null

if ($Path) {
if (Test-Path $Path) {        
    # Need to construct new command line
    $AppendMode = $true

    if ($Encoding.Length -eq 0) {
    # ASCII is default encoding for Export-CSV
    $Encoding = 'ASCII'
    }

    # For Append we use ConvertTo-CSV instead of Export
    $scriptCmdPipeline += 'ConvertTo-Csv -NoTypeInformation '

    # Inherit other CSV convertion parameters
    if ( $UseCulture ) {
    $scriptCmdPipeline += ' -UseCulture '
    }
    if ( $Delimiter ) {
    $scriptCmdPipeline += " -Delimiter '$Delimiter' "
    } 

    # Skip the first line (the one with the property names) 
    $scriptCmdPipeline += ' | Foreach-Object {$start=$true}'
    $scriptCmdPipeline += '{if ($start) {$start=$false} else {$_}} '

    # Add file output
    $scriptCmdPipeline += " | Out-File -FilePath '$Path' -Encoding '$Encoding' -Append "

    if ($Force) {
    $scriptCmdPipeline += ' -Force'
    }

    if ($NoClobber) {
    $scriptCmdPipeline += ' -NoClobber'
    }   
}
}
} 



$scriptCmd = {& $wrappedCmd @PSBoundParameters }

if ( $AppendMode ) {
# redefine command line
$scriptCmd = $ExecutionContext.InvokeCommand.NewScriptBlock(
    $scriptCmdPipeline
    )
} else {
# execute Export-CSV as we got it because
# either -Append is missing or file does not exist
$scriptCmd = $ExecutionContext.InvokeCommand.NewScriptBlock(
    [string]$scriptCmd
    )
}

# standard pipeline initialization
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)

} catch {
throw
}

}

process
{
try {
    $steppablePipeline.Process($_)
} catch {
    throw
}
}

end
{
try {
    $steppablePipeline.End()
} catch {
    throw
}
}
<#

.ForwardHelpTargetName Export-Csv
.ForwardHelpCategory Cmdlet

#>
}
###################################################################################################################################
#   Script
###################################################################################################################################
# Get Start Time
$startDTM = (Get-Date)
$ADproperties = 'FirstName','LastName','userAccountControl','physicaldeliveryofficename','l','City','UserPrincipalName','NTAccountName','SamAccountName','ParentContainer','Description','msExchHomeServerName'
#$CSVdirectory = "C:\UserListBuilder\CSV\Exch2003\*.*"  # Directory containing Exchange directory export CSV files, include *.*
$csv = "C:\UserListBuilder\CSV\Exch2003\ex03.csv"
$Outputfilename = "C:\UserListBuilder\Exchange2003-ADInfo.csv"

# Create a file of the legacy mailboxes
Get-Mailbox -ignoredefaultscope -ResultSize 'Unlimited' | where { $_.'RecipientTypeDetails' -eq [Microsoft.Exchange.Data.Directory.Recipient.RecipientTypeDetails]'LegacyMailbox' } | select 'DisplayName','SamAccountName','UserPrincipalName' | epcsv $csv -notype

$CurrentFile = Import-Csv $csv

foreach($Row in $CurrentFile)
{
$CurrentUser = $Row.'UserPrincipalName'

$CurrentUserADinfo = Get-QADUser -identity "$CurrentUser" -DontUseDefaultIncludedProperties -IncludedProperties $ADproperties | select-object $ADproperties
Merge-Object $Row $CurrentUserADinfo
$Row | Export-CSV -Path $Outputfilename -Append -NoTypeInformation
}

# Get End Time
$endDTM = (Get-Date)

# Echo Time elapsed
"Elapsed Time: $(($endDTM-$startDTM).totalseconds) seconds"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...