none
match, compare-object, performance

    Frage

  • moin,

    ich möchte den Code optimieren und einen bestimmten User in einem Objekt finden.

    ich habe eine Textdatei mit wenigen Benutzern. Dann habe ich noch viele Mailboxen mit vielen Berechtigungen. Sieht ungefähr so aus wie unten.

    ich denke ich laufe mit einer schleife alle (vielen) Mailboxen durch und dann vergleiche ich den User aus der Mailboxberechtigung mit den in der kleineren Textdatei. Sollte daher schneller sein.

    -------

    Textdatei

    Kz;ID

    D;demo1

    N;demo2

    ------

    Mailbox mit Berechtigung (bespiel hat leider umbruch) im org. gibt es eine Property USER

    Identity             User                 AccessRights                                                                                                                                                                                          IsInherited Deny
    --------             ----                 ------------                                                                                                                                                                                          ----------- ----
    company/Aemt... NT AUTHORITY\SELF    {FullAccess,                                                                                                                                                                       False       False
    company/Aemt... NT AUTHORITY\SELF    {FullAccess, ExternalAccount, ReadPermission}                                                                                                                                                         False       False
    company/Aemt... company\demo2         {FullAccess}                                                                                                                                                                                          False       False
    company/Aemt... company\sysadm        {FullAccess}     

    $id = import-csv C:\jobs\AD\test.txt

    foreach($mailbox in $mailboxes){ $Perms = get-mailboxpermission $mailbox.alias

    foreach($Perm in $perms){ $test = Compare-Object $perm.user $id.user #==> geht nicht } }

    1. kann ich mit mit einem Arbeitsschritt match oder compare herausfinden ob der User in der Textdatei vorkommt ohne immer innerhalb der Schleife zig mal mit einer extra Schleife die Textdatei durchlaufen zu müssen?

    2. zusatzfrage: kann ich in einem Arbeitsschritt beim Import der Textdatei gleich nur die Spalte User auslesen, das im $ID Objekt nur User drinnen ist?


    Chris

    Dienstag, 27. November 2018 08:02

Antworten

  • Chris,

    wenn Deine Text-Datei so aussieht, ist es eine CSV-Datei. Diese soltlest Du auch so behandeln. Dann könntest Du z.B. mittels -Contains und ohne Schleife prüfen, ob eine bestimmte ID in den IDs enthalten ist. Das sind quasi beide Antworten.  ;-)

    $CSV = import-csv C:\jobs\AD\test.txt
    $CSV.ID -contains 'demo1'

    Wenn Du hier was postest, was quasi wie code ist und z.B. besser lesbar ist oder nur Sinn macht, wenn z.B. kein Zeilenumbruch drinn ist, warum formatierst Du's dann nicht einfach als Code?????  :-/


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Dienstag, 27. November 2018 08:47
    • Als Antwort markiert -- Chris -- Dienstag, 27. November 2018 09:01
    Dienstag, 27. November 2018 08:44
  • Wobei die Contains-Methode hier auch sequentiell sucht.

    Du kannst die CSV per foreach auch erst mal in eine Hashtable laden:
    https://www.windowspro.de/script/hash-table-powershell-erzeugen-elemente-hinzufuegen-loeschen-sortieren

    Ein $MyHash.ContainsKey ist dann schneller als die sequentielle Methode.

    Ggf. kann auch ein "foreach -parallel" noch zusätzlich was bringen.
    https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_foreach-parallel?view=powershell-5.1


    • Bearbeitet bfuerchau Dienstag, 27. November 2018 08:56
    • Als Antwort markiert -- Chris -- Dienstag, 27. November 2018 09:01
    Dienstag, 27. November 2018 08:55

Alle Antworten

  • Chris,

    wenn Deine Text-Datei so aussieht, ist es eine CSV-Datei. Diese soltlest Du auch so behandeln. Dann könntest Du z.B. mittels -Contains und ohne Schleife prüfen, ob eine bestimmte ID in den IDs enthalten ist. Das sind quasi beide Antworten.  ;-)

    $CSV = import-csv C:\jobs\AD\test.txt
    $CSV.ID -contains 'demo1'

    Wenn Du hier was postest, was quasi wie code ist und z.B. besser lesbar ist oder nur Sinn macht, wenn z.B. kein Zeilenumbruch drinn ist, warum formatierst Du's dann nicht einfach als Code?????  :-/


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH_666 Dienstag, 27. November 2018 08:47
    • Als Antwort markiert -- Chris -- Dienstag, 27. November 2018 09:01
    Dienstag, 27. November 2018 08:44
  • Wobei die Contains-Methode hier auch sequentiell sucht.

    Du kannst die CSV per foreach auch erst mal in eine Hashtable laden:
    https://www.windowspro.de/script/hash-table-powershell-erzeugen-elemente-hinzufuegen-loeschen-sortieren

    Ein $MyHash.ContainsKey ist dann schneller als die sequentielle Methode.

    Ggf. kann auch ein "foreach -parallel" noch zusätzlich was bringen.
    https://docs.microsoft.com/en-us/powershell/module/psworkflow/about/about_foreach-parallel?view=powershell-5.1


    • Bearbeitet bfuerchau Dienstag, 27. November 2018 08:56
    • Als Antwort markiert -- Chris -- Dienstag, 27. November 2018 09:01
    Dienstag, 27. November 2018 08:55
  • liefert false? obwohl der demo user im Textfile vorhanden ist und das Objekt $csv in beinhaltet.

    $CSV = import-csv C:\jobs\AD\test.txt
    $CSV.ID -contains 'demo1'

    noch eine Idee?


    Chris

    Dienstag, 27. November 2018 09:32
  • sorry habe das .id vergessen

    Chris

    Dienstag, 27. November 2018 09:33