none
Powershell Script - Import Telefonnummer aus CSV Datei in AD RRS feed

  • Frage

  • Hallo zusammen,

    ich hoffe mir kann hier jemand behilflich sein.

    Kenntnisse über Powershell sind sehr eingeschränkt.

    Daher habe ich mir ein Scriptbeispiel aus dem Internet gezogen und wollte dies anpassen.

    Es geht darum, dass aus einer CSV Datei der Nachname und Vorname  gesucht wird und dann die Telefonnummer dem AD-User hinterlegt wird.

    Hier mal das Script, dass ich bisher habe:

    Import-CSV .\Import-Test.csv
    
    ForEach-Object {Get-ADUser -Filter "sn -eq `"$($_.Nachname)`"" | Set-ADUser -OfficePhone $_.Telefonnummer}

    Ich bin noch nicht dazu gekommen nach Name und Vorname zu suchen.

    Auch aufgrund dessen, dass ich nicht weiß, wie ich das -and einfüge...

    Wäre klasse, wenn mir jemand behilflich sein könnte.

    Danke schon mal im Voraus...

    Dienstag, 14. März 2017 15:19

Antworten

  • hmmmm ... bist Du Dir sicher, dass die Kombination aus Vorname und Nachname so eindeutig ist, dass es da nicht zu Komplikationen kommen kann? Ich würde eher ein bereits eindeutiges Merkmal wie den sAMAccoutnName bevorzugen. Aber erst mal mit Deinem Beispiel weiter - so sollte es funktionieren, wenn ich mich nicht irre:
    Import-CSV .\Import-Test.csv | 
    ForEach-Object {Get-ADUser -Filter "SurName -eq '$($_.Nachname)' -AND GivenName -eq '$($_.VorName)'" | Set-ADUser -OfficePhone $_.Telefonnummer}
    Bitte vorher mit "harmlosen" Accounts in der CSV-Datei testen!!

    Grüße - Best regards

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



    Dienstag, 14. März 2017 16:02

Alle Antworten

  • hmmmm ... bist Du Dir sicher, dass die Kombination aus Vorname und Nachname so eindeutig ist, dass es da nicht zu Komplikationen kommen kann? Ich würde eher ein bereits eindeutiges Merkmal wie den sAMAccoutnName bevorzugen. Aber erst mal mit Deinem Beispiel weiter - so sollte es funktionieren, wenn ich mich nicht irre:
    Import-CSV .\Import-Test.csv | 
    ForEach-Object {Get-ADUser -Filter "SurName -eq '$($_.Nachname)' -AND GivenName -eq '$($_.VorName)'" | Set-ADUser -OfficePhone $_.Telefonnummer}
    Bitte vorher mit "harmlosen" Accounts in der CSV-Datei testen!!

    Grüße - Best regards

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



    Dienstag, 14. März 2017 16:02
  • Hallo Olaf,

    ich kann das leider nicht testen im Moment, denke aber in deiner Lösung werden die Varibalen wegen den einfachen Hochkommas nicht auflösen.

    So sollte es gehen:

    Import-CSV .\Import-Test.csv | ForEach-Object {Get-AdUser -Filter "SurName -eq `"$($User.NachName)`" -and GivenName -eq `"$($User.VorName)`"" | Set-ADUser -OfficePhone $_.Telefonnummer}

    Wobei ich mich Olaf anschliessen, dass über Vor- und Zuname zu regeln ist ehrer kritisch, spätestens wenn die USeranzahl steigt.

    Beste Gruesse
    brima



    • Bearbeitet brima Mittwoch, 15. März 2017 08:19
    Dienstag, 14. März 2017 16:39
  • > Es geht darum, dass aus einer CSV Datei der Nachname und Vorname  gesucht wird und dann die Telefonnummer dem AD-User hinterlegt wird.
     
    Wäre geschickt, wenn in dem CSV z.B. der sAMAccountName steht, der ist eindeutig. Nach-/Vorname leider nicht :)
     
    > ForEach-Object {Get-ADUser -Filter "sn -eq `"$($_.Nachname)`"" | Set-ADUser -OfficePhone $_.Telefonnummer}
     
    -Filter "sn -eq `"$()`" -and givenname -eq `"xyz`""
     
    Notfalls mit Klammern arbeiten.
     
    Dienstag, 14. März 2017 16:42
  • ich kann das leider nicht testen im Moment, denke aber in deiner Lösung werden die Varibalen wegen den einfachen Hochkommas nicht auflösen.

    ... warum sollte das nicht funktionieren. Ich bezweifle, dass meine Umgebung so speziell/anders ist, dass sie sich von Deiner so stark unterscheidet, dass das nicht funktioniert. So lange die Variablen am Ende in doppelten Anführungszeichen eingeschlossen sind, werden sie auch aufgelöst. Und nach meiner zugegebenermaßen unmaßgeblichen Meinung, sind Backticks, egal in welcher Situation, einfach nur die schlechteste Lösung, die ich mir vorstellen kann .... ich hasse Diese Dinger und vermeide sie wann immer ich kann. Dann würde ich noch her doppelte doppelte Anführungszeichen verwenden ....  ;-)

    Grüße - Best regards

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


    • Bearbeitet BOfH-666 Dienstag, 14. März 2017 23:08
    Dienstag, 14. März 2017 23:07
  • Wobei ich mich Olaf anschliessen, dass über Vor- und Zuname zu regeln ist ehrer kritisch, spätestens wenn die USeranzahl steigt.


    Wenn die Daten aber z.B. aus einer TK-Anlage kommen, gibt es keinen SAMAccountName.

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Mittwoch, 15. März 2017 06:59
  • Vielen Dank für die Beiträge.

    Haben mir insofern geholfen, dass ich von der Suche nach Vor- und Nachnamen weggegangen bin.

    Nun suche ich nach der Personalnummer.

    Habe das Script so angepasst:

    Import-CSV .\Import-Test.csv
    
    ForEach-Object {Get-ADUser -Filter "employeeID -eq `"$($_.PID)`"" | Set-ADUser -OfficePhone $_.Telefonnummer}

    Leider erhalte ich immer noch einen Fehler...

    Get-ADUser : Der Suchfilter wurde nicht erkannt

    In C:\Temp\Import Phone Numbers\Import Phone Numbers.ps1:3 Zeichen:17

    + ForEach-Object {Get-ADUser -Filter "employeeID -eq `"$($_.PID)`"" | Set-ADUser - ...

    +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        + CategoryInfo          : NotSpecified: (:) [Get-ADUser], ADException

        + FullyQualifiedErrorId : ActiveDirectoryServer:8254,Microsoft.ActiveDirectory.Management.Commands.GetADUser

    Ich hoffe, ich darf euch nochmals um Hilfe bitten.

    Die Position des Fehlers (Zeichen:17) ist die Position bei Get-ADUser zwischen dem G und dem E...?

    Das Feld in der AD, in dem die Personalnummer steht ist im Attribut-Editor zu finden und heißt employeeID.

    Danke und Gruß

    Torsten

    Mittwoch, 15. März 2017 07:14
  • Du solltest Dir wirklich erstmal die Grundlagen von Powershell draufschaffen!!  ;-)
    Import-CSV .\Import-Test.csv |
    ForEach-Object {Get-ADUser -Filter "employeeID -eq '$($_.PID)'" | Set-ADUser -OfficePhone $_.Telefonnummer}
    Edit: Foreach-Object ist ein cmdlet, das empfangene Daten weiterverarbeitet. Also muss es auch Daten erhalten. Das passiert üblicherweise über die "Pipeline" mit dem Zeichen "|". Das sollte also normalerweise immer vor Foreach-Object erscheinen.  ;-) (.. und nach dem "|" darf man einen Zeilenumbruch machen ... dann isses besser lesbar)

    Grüße - Best regards

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



    • Bearbeitet BOfH-666 Mittwoch, 15. März 2017 07:35
    Mittwoch, 15. März 2017 07:31
  • ... warum sollte das nicht funktionieren.

    Hast recht, war mein Fehler, deine Lösung funktioniert natuerlich auch. Sorry. :-)

    Beste Gruesse
    brima

    Mittwoch, 15. März 2017 08:25
  • Hallo Evgenij,

    deshalb habe ich auch nur geschrieben, dass das Suchen nur über Vor- und ZuName kiritsch ist, nichts aber vom SamAccountName, weil mir das Problem mit Listen aus einer TK-Anlage bekannt ist. :-)  ...

    Beste Gruesse
    brima

    Mittwoch, 15. März 2017 08:31
  • Du solltest Dir wirklich erstmal die Grundlagen von Powershell draufschaffen!!  ;-)

    Das sollte ich wirklich mal machen...

    Kannst Du mir einen Tipp geben, wo ich am Besten anfange (Buch, Internetseite)?

    Funktioniert leider immer noch nicht...

    Ist genau die gleiche Fehlermeldung wie vorher schon gepostet, bis auf zwei Anführungszeichen, die $($_.PID)` umschließen. Diese beiden Anführungszeichen sind nun nicht mehr in der Fehlermeldung enthalten, da sie ja auch nicht in dem Befehl enthalten sind.


    Mittwoch, 15. März 2017 08:32
  • Hallo Torsten,

    dann mach es dir jetzt mal ganz einfach...

    du importierst deine .csv. Du hast nun z.B. die Variable $Liste, die deine komplette csv beinhaltet.
    Mit $Liste.Personalnummer würdest du z.B. eine Liste aller Personalnummern aus $Liste erhalten, sofern im csv auch das Feld so heißt, bei dir ist das wohl PID. Die Variablen im Code unten musst du natürlich an deine CSV anpassen.

    Jetzt machst du simplerweise einfach kein foreach-object, sondern sowas:

    foreach ($objekt in $Liste) {
    $Personalnummer = $objekt.PID #PID wäre hier der Feldname in deinem Objekt, das eine "Zeile" der csv beinhaltet
    $Telefonnummer = $objekt.phone #Phone wäre hier der Feldname in deinem Objekt, das eine "Zeile" der csv beinhaltet
    Write-Host "Dies ist ein reiner String, der deine Personalnummer beinhaltet: $Personalnummer" #mal rein zur Verständnis
    get-aduser -filter {employeeid -like "$Personalnummer"} | set-aduser -officephone "$Telefonnummer"
    }
    MfG, Jannik D.

    Mittwoch, 15. März 2017 08:50
  • Hallo Torsten,

    dann mach es dir jetzt mal ganz einfach...

    du importierst deine .csv. Du hast nun z.B. die Variable $Liste, die deine komplette csv beinhaltet.
    Mit $Liste.Personalnummer würdest du z.B. eine Liste aller Personalnummern aus $Liste erhalten, sofern im csv auch das Feld so heißt, bei dir ist das wohl PID. Die Variablen im Code unten musst du natürlich an deine CSV anpassen.

    Jetzt machst du simplerweise einfach kein foreach-object, sondern sowas:

    foreach ($objekt in $Liste) {
    $Personalnummer = $objekt.PID #PID wäre hier der Feldname in deinem Objekt, das eine "Zeile" der csv beinhaltet
    $Telefonnummer = $objekt.phone #Phone wäre hier der Feldname in deinem Objekt, das eine "Zeile" der csv beinhaltet
    Write-Host "Dies ist ein reiner String, der deine Personalnummer beinhaltet: $Personalnummer" #mal rein zur Verständnis
    get-aduser -filter {employeeid -like "$Personalnummer"} | set-aduser -officephone "$Telefonnummer"
    }
    MfG, Jannik D.

    ...ich stelle es mir so schön vor:

    PID,phone
    0001,+49 123 456789
    ... ganz viele Zeilen, und dann zum Schluss...
    *,H@x0r3d
    ;-)


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Mittwoch, 15. März 2017 09:01
  • Kannst Du mir einen Tipp geben, wo ich am Besten anfange (Buch, Internetseite)?

    ...  och ...  da gibt's ne Menge .... wenn englisch kein Hinderungsgrund ist, findest Du da bestimmt was Passendes ... hier mal ein paar gute Startpunkte:

    https://powershell.org/forums/topic/using-csv-files/


    Grüße - Best regards

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

    Mittwoch, 15. März 2017 09:41
  • > .... ganz viele Zeilen, und dann zum Schluss...
    > *,H@x0r3d
     
    Like! :-)
     
    Mittwoch, 15. März 2017 10:00