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-Key: 258504

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

Printed on: April 19, 2024 at 22:04 o'clock

Member: emeriks
emeriks Dec 24, 2014 at 12:59:46 (UTC)
Goto Top
Hi,
es ist schwer, etwas über Zeile 56 zu sagen, wenn diese hier nicht dabei ist ... face-wink

E.
Member: BirdyB
BirdyB Dec 24, 2014 updated at 13:21:11 (UTC)
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?
Member: emeriks
emeriks Dec 24, 2014 at 13:49:40 (UTC)
Goto Top
Könnte es sein, dass die betreffende Gruppe tatsächlich keine Benutzer als direkte Mitglieder hat?
Member: colinardo
colinardo Dec 24, 2014 updated at 14:06:40 (UTC)
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
Member: BirdyB
BirdyB Dec 24, 2014 updated at 14:32:16 (UTC)
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
Member: colinardo
colinardo Dec 24, 2014 updated at 14:52:40 (UTC)
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.
Member: BirdyB
BirdyB Dec 24, 2014 updated at 14:42:50 (UTC)
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.
Member: colinardo
colinardo Dec 24, 2014 updated at 15:05:54 (UTC)
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 ...
    #...
    #..

}
Member: BirdyB
BirdyB Dec 24, 2014 at 15:06:13 (UTC)
Goto Top
Weil ich keine Idee habe, wie ich die Zuordnungen Von Postfach und Gruppe sinnvoll in Powershell in eine Schleife bekomme face-wink
Member: BirdyB
BirdyB Dec 24, 2014 at 15:26:15 (UTC)
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...
Member: colinardo
Solution colinardo Dec 24, 2014 updated at 17:29:30 (UTC)
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
Member: BirdyB
BirdyB Dec 24, 2014 at 17:29:23 (UTC)
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