2016-02-19 4 views
0

Это, кажется, область, где мне не хватает. Я написал этот скрипт, который добавит пользователей в 1 группу, если они не находятся ни в одном из 3-х, и только если у них есть GUID Exchange, но он медленный, как обычно, из-за вызовов взад и вперед по AD. Я пробовал различные попытки использовать хеш-таблицы, но я не могу понять, как получить свойства подстроки, такие как MemberOf, из ключей. Я вижу преимущество сбора данных сначала через $hash = @{}, но мои различные тесты всегда имеют значение null, потому что я не понимаю, как извлечь из него строки. Вот то, что я после попытки вернуть его к старой рабочей версии ... ThxPowershell Array или Hash Table?

Import-Module ActiveDirectory 

    $a = Get-Date 
    $Logs = "C:\scripts\SEC-E2010TierGroup3\SEC-E2010TierGroup3-additions_$((Get-Date).ToString('MM-dd-yyyy')).csv" 
    $Grp0 = "SEC-E2010TierGroup0" 
    $Grp1 = "SEC-E2010TierGroup1" 
    $Grp2 = "SEC-E2010TierGroup2" 
    $Grp3 = "SEC-E2010TierGroup3" 
    #$ADUserTable = @{} 

$Users = Get-ADUser -server "dc114" -LdapFilter "(&(&(objectCategory=person)(objectClass=user)(!userAccountControl:1.2.840.113556.1.4.803:=2))(&(objectCategory=person)(objectClass=user)(!objectClass=inetOrgPerson))(sAMAccountName=s0*)(!sAMAccountName=*-d)(!sAMAccountName=*-e)(!sAMAccountName=*-a)(!Name=Test*)(!Name=v-*)(!employeeID=\00))" -properties SamAccountName, DistinguishedName,Name, memberof, msExchMailboxGuid 
    <#ForEach-Object { 
     $ADUserTable[$_.SamAccountName] = $_ 
    }#> 

    function Get-GroupMembership($DN,$group){ 
     $objEntry = [adsi]("LDAP://"+$DN) 
     $objEntry.memberOf | where { $_ -match $group} 
    } 
     #Usage: 
     # Get-GroupMembership "DistinguishedName" "DomainAdmins"#> 

    <#$Active = #>ForEach ($user in $Users) { 

    $strName = $User.samaccountname 
    $DNUser = $User.distinguishedname 

    $strFilter = "(&(objectCategory=User)(samAccountName=$strName))" 
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher 
    $objSearcher.Filter = $strFilter 
    $objPath = $objSearcher.FindOne() 
    $objUser = $objPath.GetDirectoryEntry() 
    $Exch = $objUser.msExchMailboxGuid#> 

    #If here, has an Exchange Mailbox.(Get-GroupMembership "$UserDN" "$Grp0") 
    if ($Exch.count -eq 1){ 

      If (Get-GroupMembership "$DNUser" "$Grp0") {(""+ $a +" [" + $User + "], User:[" + $User.value.Name + "] in SEC-E2010TierGroup0.") | Out-File -FilePath $Logs -Append 
          Continue} 

       If (Get-GroupMembership "$DNUser" "$Grp1") {(""+ $a +" [" + $User + "], User:[" + $User.value.Name + "] in SEC-E2010TierGroup1.") | Out-File -FilePath $Logs -Append 
          Continue} 

        If (Get-GroupMembership "$DNUser" "$Grp2") {(""+ $a +" [" + $User + "], User:[" + $User.value.Name + "] in SEC-E2010TierGroup2.") | Out-File -FilePath $Logs -Append 
          Continue} 

         If (!(Get-GroupMembership "$DNUser" "$Grp3")) { 

         (""+ $a +" [" + $User + "], User:[" + $User.value.Name + "] not in SEC-E2010TierGroup3. Adding to group3.") | Out-File -FilePath $Logs -Append} 

     } 

    #If here, no Exch Mailbox. 
    if ($Exch.count -eq 1) {(""+ $a +" [" + $User + "], User:[" + $User.value.Name + "] does not have Exchange GUID.") | Out-File -FilePath $Logs -Append 
    continue} 

    } #$Active | Export-csv C:\Scripts\SEC-E2010TierGroup3\SEC-E2010TIER-Pre-Implimentation-rpt_2-18-2016.csv -NoTypeInformation 
+0

В коде была разумная цитата. Я заменил его обычной двойной цитатой, чтобы удовлетворить Google Prettify. – Matt

ответ

0

Я не могу пройти через это и переписать все это, но я могу дать некоторые общие рекомендации.

Когда дело доходит до вызова командлетов, воспользуйтесь конвейером. Обычно командлет знает, как обрабатывать несколько элементов наиболее эффективным способом. Когда каждый вызов команд имеет накладные расходы, например, при вызове командлетов AD и , особенно Exchange-командлеты, этот эффект будет увеличен. Например:

$users | ForEach-Object { 
    Get-Mailbox $_ 
} 

против:

$users | Get-Mailbox 

Накладные соединения с обменом повторяется для каждого пользователя в первом вызове, но только один раз во втором сценарии.

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

+0

Хорошо, я попробую. Итак, я предполагаю, что могу сказать $ HasMail = $ Пользователи | Get-Mailbox и проверить true или false вместо метода поиска каталогов? – MarcGel

+0

@MarcGel возможно, да, возможно, добавьте '-ErrorAction SilentlyContinue'. – briantist

+0

Хотя хороший совет, я надеялся узнать больше о том, как использовать хеш-таблицу здесь. Я могу создать один и увидеть значения там, но я, похоже, не могу выполнять сравнения строк, как я могу, с массивом. – MarcGel