none
IF -eq geht nicht? -like schon RRS feed

  • Frage

  • moin,

    es gibt bei den Kalender Permissionproperties ein Userfeld "Default"

    wenn ich diesem mit -eq überprüfen will funktioniert es nicht. Mit -like geht es?

    $Permission.User -eq 'Default'
    
    #oder
    
    $Permission.User -eq "Default"

    geht es nicht. Lediglich mit -like

    obwohl unter User einen Default gibt.

    $ExSession = New-PSSession -ConfigurationName "Microsoft.Exchange" -ConnectionUri http://ex/PowerShell/ -Authentication Kerberos
    Import-PSSession $ExSession -AllowClobber
    
    $Mailboxes = Get-Mailbox -Database "user"
    foreach($Mailbox in $Mailboxes){
    #$c.Name, $c.Alias
    $Alias = $Mailbox.Alias + ":\Kalender"
    $Perms = Get-MailboxFolderPermission $Alias
        foreach($Permission in $Perms){
            if($Permission.AccessRights -ne 'AvailabilityOnly' -and $Permission.User -like 'Default*'){
                write-host $Mailbox.Name $Permission.user $Permission.Accessrights -ForegroundColor Yellow
            }
        }
    }



    Chris


    Sonntag, 24. März 2019 07:34

Antworten

  • Moin,

    wie immer bei PowerShell, wenn irgendwas nicht so funktioniert wie erwartet, muss man sich fragen, von welchem Typ die Ergebnisse sind ;-)

    [PS] C:\Windows\system32>$perms = Get-MailboxFolderPermission root:\Kalender
    [PS] C:\Windows\system32>$perms[0].User
    
    UserType ADRecipient DisplayName
    -------- ----------- -----------
     Default             Default
    
    
    [PS] C:\Windows\system32>$perms[0].User.ToString()
    Default
    [PS] C:\Windows\system32>$perms[0].User -eq "Default"
    False
    [PS] C:\Windows\system32>$perms[0].User.DisplayName -eq "Default"
    True


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Sonntag, 24. März 2019 08:17
    Sonntag, 24. März 2019 08:13

Alle Antworten

  • Moin,

    wie immer bei PowerShell, wenn irgendwas nicht so funktioniert wie erwartet, muss man sich fragen, von welchem Typ die Ergebnisse sind ;-)

    [PS] C:\Windows\system32>$perms = Get-MailboxFolderPermission root:\Kalender
    [PS] C:\Windows\system32>$perms[0].User
    
    UserType ADRecipient DisplayName
    -------- ----------- -----------
     Default             Default
    
    
    [PS] C:\Windows\system32>$perms[0].User.ToString()
    Default
    [PS] C:\Windows\system32>$perms[0].User -eq "Default"
    False
    [PS] C:\Windows\system32>$perms[0].User.DisplayName -eq "Default"
    True


    Evgenij Smirnov

    http://evgenij.smirnov.de

    • Als Antwort markiert -- Chris -- Sonntag, 24. März 2019 08:17
    Sonntag, 24. März 2019 08:13
  • Danke

    hmm, ganz schön verwirrend. Ganz verstehe ich es noch nicht. Du testet ja mit dem Perms das ja noch ein Array ist bzw. mehrere Objekte sind.

    Ich vergleich ja bereits mit dem einzelnen Objekt Perm User das nicht unter {} steht? Somit sollte unter "User" nur ein Wert steht - oder? Wenn {} dann ist es ein Array.

    FolderName           User                 AccessRights                                                                                             
    ----------           ----                 ------------                                                                                             
    Kalender             Default              {AvailabilityOnly}  


    Chris


    Sonntag, 24. März 2019 08:23
  • Der Vergleich begründet sich auf dem Typ der Variablen.
    Mittels "==" (C#) bzw. "-eq" (PS) wird ein Objekt mit dem anderen Verglichen.
    Das jeweilige Objekt selber bringt dabei seine interne CompareTo-Methode mit.
    Alle skalaren Variablen passen dann im 2. Operanden dessen Wert nach Möglichkeit an den eigenen Typ an.
    Bei Objekten ohne CompareTo wird die Obect.CompareTo()-Methode aufgerufen und diese prüft ob das eigene Objekt zum Vergleichsobjekt identisch ist, also die gleiche Speicheradresse hat.

    Der Operator "like" ist explizit als String-Vergleich definiert.
    Ist nun ein Operand nicht vom Typ String, wird dessen ToString()-Methode aufgerufen.
    Die Standard-ToString()-Methode liefert i.d.R. den Objekt-Type als Zeichen zurück.

    Somit erklärt sich, warum "-eq" nicht funktioniert und "like" aber schon, da die ToString()-Methode des Objektes eben "Default" meldet. Andere Objekte melden auch gerne "NULL", was ggf. mit $Null verglichen werden kann.

    Da Powershell .Net-basiert ist, gelten hier ebenso die Grundsätze der .Net-Programmierung.


    Sonntag, 24. März 2019 10:42
  • Huh?

    $perms[0] *ist* ein einzelnes Objekt, und zwar das erste im Array ;-)


    Evgenij Smirnov

    http://evgenij.smirnov.de

    Sonntag, 24. März 2019 11:41
  • Sorry dass ich das rückgängig machen muß, aber "=" ist keineswegs eine Vergleichsmethode in PowerShell und auch keine Art "alias" für CompareTo().
    Es ist ein reiner Zuweisungsoperator, d.h. der Variablen oder der Objekteigenschaft vor dem "=", wird der Wert oder das Objekt nach dem "=" zugewiesen.

    "-like" ist vor allem sinnvoll als "Regex"-Light, weil man Vergleiche mit Wildcards machen kann, also "*" oder "?" , siehe hier LINK


    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 28. März 2019 14:27
    Moderator
  • Klar, wenn man .Net und PS (leider) vermischt, in .Net müsste es auch "==" heißen.
    Deshalb habe ich a auch den "-eq" mit angegeben.

    Und da -like ein Stringoperator ist, bleibt auch hier der ToString()-Aufruf, was ja durch obiges Ergebnis bestätigt wurde;-).

    Donnerstag, 28. März 2019 16:38
  • Wenn du "=" rauslöschst, markiers ich wieder als Antwort.

    Blog: http://www.bytecookie.de

    Powershell Code Manager: Link
    (u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 28. März 2019 16:54
    Moderator