none
Schleife bis User vorhanden

    Frage

  • Hallo Leute, die Schleife an sich ist ja eigentlich kein Problem

    folgendes versuche ich grade:

    while ($user -eq $NULL){
    
    start-sleep -s 900
    }

    Problem dabei ist folgendes:

    Ich möchte das Postfach des Users aktivieren. Nur ist der User in dem Moment wo ich ihn anlege nicht mehr -eq Null, allerdings dauert der Abgleich von AD und Exchange relativ lange. Und der Exchangeserver findet eben diesen Nutzer nicht, auch wen ner schon vorhanden ist. Daher wird auch das start-sleep nie ausgelöst. Kann man das irgendwie umstrukturieren, damit er sozusagen den Abgleich mit dem Exchange macht und nicht mit dem AD? Ich hoffe ich hab es nicht zu kompliziert ausgedrückt...

    Gruß Antenne

    Freitag, 9. März 2018 08:39

Antworten

  • Hier auf dem Bild auch zu sehen. Er findet den ADUser

    Aber kann das Postfach nicht aktivieren

    Moin,

    Du kannst versuchen, dem Cmdlet Enable-Mailbox den Parameter -DomainController mit dem DC aus dem User-Standort mitzugeben.

    Noch wirksamer ist es in einem Multisite-/Multiforest-Szenario, wenn man alle AD- und Exchange-Operationen explizit gegen denselben DC laufen lässt.

    @Denniver: Nee, die Fehlermeldung ist leider nicht bogus. Bei einer etwas fortgeschrittenen AD-Topologie ist es nicht unüblich, dass man bei Exchange entweder tricksen oder lange warten muss.


    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 -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 13. März 2018 14:24
  •  if ($user="temp") { start-sleep -s 5}
    ... das ist ne Zuweisung. Du meintest vermutlich eher
     if ($user -eq "temp") { start-sleep -s 5}
    ;-)

    Best regards,

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

    • Als Antwort markiert antenne1988 Donnerstag, 22. März 2018 13:00
    Donnerstag, 22. März 2018 11:16
  • Ich habe es jetzt endlich gelöst und zwar so:

    $user = "temp"
    Set-ADServerSettings -ViewEntireForest $true
    do {
    
    Set-ADServerSettings -ViewEntireForest $true 
    Enable-Mailbox -identity $account -alias $alias 
    
       $user = Get-mailbox $account 
    $user
       if (!$user) { start-sleep -s 900}
    
    } until ($user)
    
    
    Er legt das Postfach nach einer Weile an und verlässt endlich die Schleife. Ich danke allen Beteiligten für die Unterstützung!


    • Als Antwort markiert antenne1988 Freitag, 23. März 2018 13:44
    Freitag, 23. März 2018 13:44

Alle Antworten

  • Moin,
    wenn Du mit Exchange abgleichen willst, dann gleiche mit Exchange ab. Remoting zu Exchange aufbauen, dann Get-Mailbox... Ansonsten würde ich bei so etwas immer eher mit do {} until als mit while {} arbeiten.

    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 -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 9. März 2018 08:50
  • Es soll alles mit einem Script erledigt werden, per Remote irgendwo drauf ist da keine Option. Und was ändert do {} until? Wird doch bestimmt auf das Selbe hinaus laufen oder? Also, dass er den Nutzer sofort findet und somit nicht das start-sleep ausgelöst wird.
    Freitag, 9. März 2018 11:27
  • Moin, Remoting zu Exchange geht innerhalb eines Skriptes ganz wunderbar. Do-until würde bewirken, dass die Abfrage, ob die Mailbox endlich da ist, nur einmal geschrieben werden muss, innerhalb der Schleife.

    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 -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 9. März 2018 11:42
  • Das wäre das Script mit While

    $UserCredential = Get-Credential domain\benutzer
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://URL/PowerShell/ -Authentication Kerberos -Credential $UserCredential
    Import-PSSession $Session
    
    #$account="test.xov"
    $alias="$vorname.$name"
    #$alias="xov.test"
    $user=$account
    while ($user -eq $NULL){
    
    start-sleep -s 900
    }
    
    Set-ADServerSettings -ViewEntireForest $true
    Enable-Mailbox -identity $account -alias $alias
    
    Wie müsste es dann aussehen, wenn ich erst per Remote auf den Exchange gehe? Ich bin ja durch die Session oben mit dem Exchange verbunden. 

    Freitag, 9. März 2018 11:49
  • Genau. Dann sind ja alle Voraussetzungen gegeben.

    Ich sehe in Deinem Code nur nicht, wo Du periodisch abfragst, ob es den User schon gibt.

    Das könnte so aussehen:

    $UserCredential = Get-Credential domain\benutzer
    $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://URL/PowerShell/ -Authentication Kerberos -Credential $UserCredential
    Import-PSSession $Session
    Set-ADServerSettings -ViewEntireForest $true
    
    $account = "$vorname.$name"
    $alias = "$vorname.$name"
    $user = $null
    do {
       $user = Get-User $account
       if (!$user) { start-sleep -s 900 }
    } until ($user)
    
    Enable-Mailbox -identity $account -alias $alias


    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 -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Freitag, 9. März 2018 15:18
  • Na mit 

    while ($user -eq $NULL){

     oder nicht? Erst wenn $user nicht mehr Null ist, aktiviert der das Postfach. Auch das Get-ADUser funktioniert nicht, da er den User sofort findet und danach aber das Postfach nicht aktivieren kann, da der Exchange ihn nicht findet. Der Exchange ist nicht lokal bei uns im Haus sonder ein externer Server ( In der Hauptzentrale).

    Hier auf dem Bild auch zu sehen. Er findet den ADUser

    Aber kann das Postfach nicht aktivieren

    Montag, 12. März 2018 06:20
  • Du hast hier zwei Probleme.
     

    Erstmal: $user wird nicht automatisch befüllt. Wie auch?
    Du musst immer wieder innerhalb der Schleife Abfragen und versuchen $user zu füllen, so wie Evgenij dir das beispielhaft gezeigt hat.
     
    Das zweite Problem ist dann, das trotzdem der User nicht aktiviert werden kann. Da die Fehlermeldung scheinbar bogus ist, musst du dich da rantasten: kannst du gar keine Postfächer aktivieren oder nur bestimmte nicht? Lassen sich bereits aktive wieder deaktivieren? Sind überhaupt Exchange-Kommandos möglich etc.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Code Manager v5: 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.

    Dienstag, 13. März 2018 14:01
    Moderator
  • Hier auf dem Bild auch zu sehen. Er findet den ADUser

    Aber kann das Postfach nicht aktivieren

    Moin,

    Du kannst versuchen, dem Cmdlet Enable-Mailbox den Parameter -DomainController mit dem DC aus dem User-Standort mitzugeben.

    Noch wirksamer ist es in einem Multisite-/Multiforest-Szenario, wenn man alle AD- und Exchange-Operationen explizit gegen denselben DC laufen lässt.

    @Denniver: Nee, die Fehlermeldung ist leider nicht bogus. Bei einer etwas fortgeschrittenen AD-Topologie ist es nicht unüblich, dass man bei Exchange entweder tricksen oder lange warten muss.


    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 -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Dienstag, 13. März 2018 14:24
  • Das würde nichts bringen, den user in der Schleife immer wieder zu füllen, da er eh sofort den Nutzer findet sobald ich get-aduser verwende. Wenn ich ein paar Stunden warte, kann ich das Postfach aktivieren, daher ja die Schleife. Dann muss ich es nicht alle viertel Stunde versuchen, sondern das Script macht es für mich.
    Mittwoch, 14. März 2018 07:17
  • Das werde ich mal versuchen. Vielen Dank für den Tip. Ich melde mich später, egal ob es erfolgreich war oder nicht.
    Mittwoch, 14. März 2018 07:17
  • Hallo, ich wollte mal Rückmeldung geben. Der Parameter -domaincontroller hat leider nicht zum erfolg geführt. Er findet den User auf unserem DC nicht, Natürlich finde ich ihn wenn ich direkt auf den DC gehe. Der Tip von dir mit der While Schleife scheint aber zu funktionieren. Ich habe start-sleep mal auf 5 Sekunden gesetzt und er bringt alle 5 Sekunden die Fehlermeldung, dass er ihn nicht findet. Ich lasse es jetzt eine Weile laufen um zu sehen ob es irgendwann das Postfach aktiviert hat. Ich melde mich dann wieder. Vielen Dank erstmal.

    Edit: Er Verlangt alle paar Minuten, dass ich mein Passwort eingebe. Kann ich das in einer Variable hinterlegen, so dass er sich es aus dieser nehmen kann?

    • Bearbeitet antenne1988 Mittwoch, 21. März 2018 07:35
    Mittwoch, 21. März 2018 07:33
  • Ich lasse es jetzt eine Weile laufen um zu sehen ob es irgendwann das Postfach aktiviert hat.

    Kannst laufen lassen bis zum Sankt-Nimmerleins-Tag, denn...

    $user=$account
    while ($user -eq $NULL){

    start-sleep -s 900
    }

    ...wenn Du $user nicht innerhalb der Schleife neu befüllst, dann wird da immer $NULL drinstehen bleiben.

    Edit: Er Verlangt alle paar Minuten, dass ich mein Passwort eingebe. Kann ich das in einer Variable hinterlegen, so dass er sich es aus dieser nehmen kann?

    Get-Help Get-Credential

    Mittwoch, 21. März 2018 13:30
  • Ich zitiere mich hier kurz selbst:

    "Der Tip von dir mit der While Schleife scheint aber zu funktionieren."

    Dabei bezog ich mich auf folgendes:

    $user = $null
    do {
       $user = Get-User $account
       if (!$user) { start-sleep -s 900 }
    } until ($user)

    Das hatte leider nicht funktioniert, bis ich die Schleife manuell abgebrochen hatte.

    Mit folgendem Script, legt er nach einiger Zeit das Postfach an, allerdings verlässt er die Schleife nicht.

    $user = "temp"
    Set-ADServerSettings -ViewEntireForest $true
    do {
    
    
       $user = Get-ADUser $account
       if ($user="temp") { start-sleep -s 5}
    
    Set-ADServerSettings -ViewEntireForest $true 
    Enable-Mailbox -identity $account -alias $alias 
    Import-PSSession $Session
    } until ($user -ne "temp")
    

    Donnerstag, 22. März 2018 10:29
  •  if ($user="temp") { start-sleep -s 5}
    ... das ist ne Zuweisung. Du meintest vermutlich eher
     if ($user -eq "temp") { start-sleep -s 5}
    ;-)

    Best regards,

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

    • Als Antwort markiert antenne1988 Donnerstag, 22. März 2018 13:00
    Donnerstag, 22. März 2018 11:16
  • Genau das hab ich grade selber gesehen :D ich wollte grade ein EDIT schreiben, dass ich den Fehler gefunden hatte. Aber trotzdem vielen Dank :P

    EDIT: Allerdings besteht das Problem weiterhin. Der Befehl Get-ADUser funktioniert. Er findet den Nutzer (in unserer Domain). Aber der Exchange findet ihn nicht. Ist echt schwierig zu erklären.

    folgender Fehler kommt:

    Der Vorgang konnte nicht ausgeführt werden, weil das Objekt 'XXX.H' nicht auf 'Name.Domain.de' gefunden wurde.
        + CategoryInfo          : NotSpecified: (:) [Enable-Mailbox], ManagementObjectNotFoundException
        + FullyQualifiedErrorId : [Server=XXX,RequestId=3468a200-0de9-42c3-a9d7-def1ab8aa462,TimeStamp=22.03.2018 13:02:02]
        [FailureCategory=Cmdlet-ManagementObjectNotFoundException] A7D12080,Microsoft.Exchange.Management.RecipientTasks.Enable
      Mailbox
        + PSComputerName        : name.domain.de

    Echt ein sehr nerviges Problem. Da macht es ja fast mehr Sinn, eine endlose Schleife laufen zu lassen und sobald das Postfach aktiviert wurde, die Schleife manuell zu beenden.

    EDIT 2: Gibt es denn nicht z.B. die Möglichkeit, abzufragen ob der Nutzer ein aktives Postfach hat? Und das dann als Bedingung für das Beenden der Schleife?
    • Als Antwort markiert antenne1988 Donnerstag, 22. März 2018 13:00
    • Tag als Antwort aufgehoben antenne1988 Donnerstag, 22. März 2018 13:00
    • Bearbeitet antenne1988 Donnerstag, 22. März 2018 13:10
    Donnerstag, 22. März 2018 13:00
  • > EDIT: Allerdings besteht das Problem weiterhin. Der Befehl Get-ADUser funktioniert. Er findet den Nutzer (in unserer Domain). Aber der Exchange findet ihn nicht. Ist echt schwierig zu erklären.

    Ich versteh's problemlos :-)

    Alle AD- und m.w. auch die meisten Exchange-CMDlets können zu einem definierten Domain Controller geschickt werden. Bei AD heißt das -server, bei xch -DomainController.

    Für mich hat sich folgendes bewährt:

    $Domain               = Get-ADDomain -Current LoggedOnUser
    $DomainDN             = $Domain.DistinguishedName
    $DomainDNS            = $Domain.DNSRoot
    $PDC                  = $Domain.PDCEmulator
    $DomainNB             = $Domain.NetBIOSName

    Und dann nehme ich $PDC für alles, was mit dem AD redet, egal ob lesend oder schreibend. (Die anderen Variablen brauche ich nicht so oft, aber wenn man schon mal dabei ist...)

    Donnerstag, 22. März 2018 15:07
  • Ich habe es jetzt endlich gelöst und zwar so:

    $user = "temp"
    Set-ADServerSettings -ViewEntireForest $true
    do {
    
    Set-ADServerSettings -ViewEntireForest $true 
    Enable-Mailbox -identity $account -alias $alias 
    
       $user = Get-mailbox $account 
    $user
       if (!$user) { start-sleep -s 900}
    
    } until ($user)
    
    
    Er legt das Postfach nach einer Weile an und verlässt endlich die Schleife. Ich danke allen Beteiligten für die Unterstützung!


    • Als Antwort markiert antenne1988 Freitag, 23. März 2018 13:44
    Freitag, 23. März 2018 13:44