birdyb
Goto Top

Skriptproblem - Exchange 2013

Hallo und Frohe Weihnachten liebe Kolleginnen und Kollegen,

ich habe ein kleines Problem mit einem Skript, welches @colinardo mir freundlicherweise erstellt hat. Es soll Send-On-Behalf und Mailbox Full Access Rechte an die Mitglieder von Gruppen vergeben. Bis zum letzten Exchange-Update hat das Skript auch einwandfrei funktioniert, jetzt allerdings erhalte ich nur Fehlermeldungen.
Das Skript lautet wie folgt:
# Exchange-Shell laden


$s = Get-PSSession | Where-Object {$_.ConfigurationName -eq 'Microsoft.Exchange'}  
if($s){
    Write-Host "Exchange Management Shell already loaded"  
}
else
{
    Write-Host "Exchange Management Shell not found - Loading..." -ForegroundColor Yellow  
 
        . "$env:ExchangeInstallPath\bin\RemoteExchange.ps1"  
 
        Write-Host "Exchange Management Shell loaded $nl"   -ForegroundColor green  
 
        Write-Host "Connecting to Exchange server $nl"  
 
        Connect-ExchangeServer -auto
 
        Write-Host "Connected to Exchange Server $nl" -ForegroundColor green  
}


# Postfach1


$mailbox = "buchhaltung@example.com"  
$group = "Buchhaltung"  

$mailboxFullRightUsers = Get-MailboxPermission $mailbox | ?{$_.AccessRights -eq "FullAccess" -and $_.IsInherited -eq $false} | %{$_.User.toString().split("\")[1]}  
$groupMemberUsers = Get-AdGroupMember -Identity $group | ?{$_.ObjectClass -eq "user"} | %{$_.SamAccountName}  

# SendOnBehalf Recht vergeben
Set-Mailbox $mailbox -GrantSendOnBehalfTo $groupMemberUsers

# Füge Gruppen-Member zur Shared Mailbox hinzu die noch keinen Vollzugriff haben
Compare $mailboxFullRightUsers $groupMemberUsers -PassThru | ?{$_.SideIndicator -eq "=>"} | %{echo "Füge User '$_' der Mailbox hinzu"; Add-MailboxPermission $mailbox -User $_ -AccessRights FullAccess -InheritanceType All | out-null}  

# Entferne Permissions wenn User nicht mehr Mitglied der Gruppe
Compare $mailboxFullRightUsers $groupMemberUsers -PassThru | ?{$_.SideIndicator -eq "<="} | %{echo "Entferne User '$_' aus der Shared Mailbox"; Remove-MailboxPermission $mailbox -User $_ -AccessRights FullAccess -Confirm:$false | out-null}  

Die Fehlermeldung lautet folgendermaßen:

Compare-Object : Das Argument kann nicht an den Parameter "ReferenceObject" gebunden werden, da es NULL ist.  
In C:\Skripte\Postfachberechtigungen.ps1:56 Zeichen:9
+ Compare $mailboxFullRightUsers $groupMemberUsers -PassThru | ?{$_.SideIndicator  ...
+         ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Compare-Object], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObjectCommand

Hat jemand eine Idee, wie ich das Skript anpassen muss, dass es wieder funktioniert?

Vielen Dank für die Hilfe!

Beste Grüße!

Berthold

Content-ID: 258504

Url: https://administrator.de/contentid/258504

Ausgedruckt am: 22.11.2024 um 21:11 Uhr

emeriks
emeriks 24.12.2014 um 13:59:46 Uhr
Goto Top
Hi,
es ist schwer, etwas über Zeile 56 zu sagen, wenn diese hier nicht dabei ist ... face-wink

E.
BirdyB
BirdyB 24.12.2014 aktualisiert um 14:21:11 Uhr
Goto Top
Du hast natürlich Recht... Der Block zwischen Zeile 24 und 41 wiederholt sich noch für einige andere Postfächer, daher habe ich die Wiederholungen weggelassen.
Zeile 56 lautet:
Compare $mailboxFullRightUsers $groupMemberUsers -PassThru | ?{$_.SideIndicator -eq "=>"} | %{echo "Füge User '$_' der Mailbox hinzu"; Add-MailboxPermission $mailbox -User $_ -AccessRights FullAccess -InheritanceType All | out-null}  

Ich habe gerade nochmal einzelne Teile des Skripts manuell ausgeführt. Eine Sache hat mich jedoch etwas gewundert:
[PS] C:\Windows\system32>compare
Cmdlet Compare-Object an der Befehlspipelineposition 1
Geben Sie Werte für die folgenden Parameter an:
ReferenceObject: $mailboxfullrightusers
ReferenceObject[1]: $groupmemberusers
ReferenceObject[2]: 
DifferenceObject: 

InputObject                                                                                     SideIndicator                                                                                 
-----------                                                                                     -------------                                                                                 
$mailboxfullrightusers                                                                          <=                                                                                            
$groupmemberusers                                                                               <=                                                                                            



[PS] C:\Windows\system32>Compare $mailboxFullRightUsers $groupMemberUsers
Compare-Object : Das Argument kann nicht an den Parameter "ReferenceObject" gebunden werden, da es NULL ist.  
In Zeile:1 Zeichen:9
+ Compare $mailboxFullRightUsers $groupMemberUsers
+         ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Compare-Object], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CompareObjectCommand

Einzeln eingegeben erhalte ich keine Fehlermeldung, übergebe ich die beiden Objekte als Parameter schon... Woran kann das liegen?
emeriks
emeriks 24.12.2014 um 14:49:40 Uhr
Goto Top
Könnte es sein, dass die betreffende Gruppe tatsächlich keine Benutzer als direkte Mitglieder hat?
colinardo
colinardo 24.12.2014 aktualisiert um 15:06:40 Uhr
Goto Top
Hallo Berthold,
bin hier zufällig gerade vorbei geschlendert...
Anscheinend hat die entsprechende Mailbox keine User denen expliziten FullAccess Rechte erteilt wurden. Wie die Fehlermeldung schon sagt ist das Reference-Object also die erste Variable $mailboxFullRightUsers leer.

Lass dir also mal folgende Zeile anzeigen:
Get-MailboxPermission $mailbox | ?{$_.AccessRights -eq "FullAccess" -and $_.IsInherited -eq $false}
wenn da nix bei raus kommt, liegt hier der Fehler. Lass dir auch mal nur
Get-MailboxPermission "buchhaltung@example.com"
anzeigen und überprüfe ob es überhaupt ein "FullAccess Right" ohne "inheritance" gibt.

Wenn das der Fall wäre müsste man dies mit einem IF abfangen und in diesem Fall einfach alle User aus $groupMemberUsers hinzufügen.

Frohes Fest
Grüße Uwe
BirdyB
BirdyB 24.12.2014 aktualisiert um 15:32:16 Uhr
Goto Top
Hallo Uwe,

also bei beiden Abfragen werden mir Benutzer angezeigt... die meisten haben bei AccessRights {FullAccess} stehen.
Auch wenn ich das Skript Schritt-für-Schritt ablaufen lasse, stehen in $mailboxfullrightusers und in $groupmemberusers Benutzer drin.

Frohes Fest und beste Grüße!


Berthold
colinardo
colinardo 24.12.2014 aktualisiert um 15:52:40 Uhr
Goto Top
Könnte sein das sich hier das CMDLet Compare-Object etwas geändert hat. Gebe die Parameternamen in der COMPARE-Zeile mal explizit an:
Compare -ReferenceObject $mailboxFullRightUsers -DifferenceObject $groupMemberUsers .....................
aber wenn die Shell sagt das das Objekt NULL ist dann wird das auch stimmen ...
Eventuell hast du durch den mehrfachen Aufrufen irgendwo einen Fehler eingebaut.
BirdyB
BirdyB 24.12.2014 aktualisiert um 15:42:50 Uhr
Goto Top
Leider immer noch der gleiche Fehler...

EDIT:

Was mir gerade aufgefallen ist: Bei der Buchhaltungsgruppe läuft das Skript ohne Fehler durch, bei allen Folgenden gibt es den Fehler.
Die Befehle sind für jedes Postfach per Copy&Paste eingefügt, nur $mailbox und $group habe ich manuell geändert.
colinardo
colinardo 24.12.2014 aktualisiert um 16:05:54 Uhr
Goto Top
Dann kann eigentlich nur irgendwo ein Schreibfehler passiert sein, Setz die Variablen in jedem Abschnitt mal manuell auf $null. Prüfe alle Variablen Schritt für Schritt für jeden Abschnitt. Kann den Fehler hier leider nicht reproduzieren. Aber wieso kopierst du die Befehle per Copy&Paste hintereinander wenn du es mit einer Schleife nur einmal benötigst face-wink ?

$ht = @{
        "mailbox1@domain.de"="Gruppe1";  
        "mailbox2@domain.de"="Gruppe2";  
        "mailbox3@domain.de"="Gruppe3";  
        }
$ht.GetEnumerator() | %{
    $mailbox = $_.Key
    $group = $_.Value

    #..... hier der Rest ...
    #...
    #..

}
BirdyB
BirdyB 24.12.2014 um 16:06:13 Uhr
Goto Top
Weil ich keine Idee habe, wie ich die Zuordnungen Von Postfach und Gruppe sinnvoll in Powershell in eine Schleife bekomme face-wink
BirdyB
BirdyB 24.12.2014 um 16:26:15 Uhr
Goto Top
Also zum Thema Schreibfehler:
Ich habe die Befehle jetzt mal in eine Funktion gepackt. Mit meiner Buchhaltungsgruppe gibt es keinen Fehler mit den anderen schon. Ich habe nur ehrlich keine Idee warum das so ist...
colinardo
Lösung colinardo 24.12.2014 aktualisiert um 18:29:30 Uhr
Goto Top
Zitat von @BirdyB:
Also zum Thema Schreibfehler:
Ich habe die Befehle jetzt mal in eine Funktion gepackt. Mit meiner Buchhaltungsgruppe gibt es keinen Fehler mit den anderen schon. Ich habe nur ehrlich keine Idee warum das so ist...
Da hilft dann leider nur penibelstes Zerlegen der Pipes und checken der Werte. Das kann ich dir hier leider nicht abnehmen, da mir deine Rohdaten fehlen, sorry.

Grüße Uwe
BirdyB
BirdyB 24.12.2014 um 18:29:23 Uhr
Goto Top
Also: Dank @colinardo habe ich das Problem jetzt gelöst: Ich hatte einen Benutzer gelöscht und deshalb stand nur eine SID in der Gruppenliste. Das hat dann den Fehler ausgelöst.
Die Lösung: Die fehlerhafte Zeile wie folgt ersetzen:
$mailboxFullRightUsers = Get-MailboxPermission $mailbox | ?{$_.AccessRights -eq "FullAccess" -and $_.IsInherited -eq $false -and $_.User.toString() -like '*\*'} | %{$_.User.toString().split("\")[1]}  

Danke nochmal für die Hilfe und frohe Weihnachten!


Berthold