Windows PowerShell Doppelte Benutzernamen

Don Jones

Inhalt

Von all Fall zuerst überprüfen
Oder nur mit behandeln
Verbesserte in Version 2

Vor kurzem habe ich einen vierteiligen Reihe in dieser Spalte, die konzentriert sich auf ein mit Windows PowerShell Benutzerbereitstellung Skript zu schreiben. Ein Leser, Jens, die in einer ziemlich detaillierten Frage Informationen zum Verbessern des Skripts geschrieben werden.

Jim hat im Wesentlichen ähnlichen Skripts in der Vergangenheit geschrieben und kämpfen Möglichkeiten, um die Fehler Behandlung auftretenden Wenn Sie einen Benutzernamen erstellen, der bereits vorhanden ist. Seine Lösung wurde zum Schreiben von "für Vortest ausführen Schleife"wobei er überprüft, ob die Verzeichnisobjekte bereits, bevor Sie fortfahren vorhanden, aber er wollte wissen, wie ich es in Meine Bereitstellung Skript Provision() Funktion Umgang mit würden.

Es ist eine gute Frage –, die ich in dieser Rubrik beantworten werde. Bedenken Sie jedoch, dass ich eingehen werde Verfahren recht universellen; sindähnliche Ansätze können zum Umgang mit anderen Situationen, in denen Sie wissen, dass ein Fehler auftreten kann. Mein Ansatz, „ Planen der aufteilen, „ aufgerufenund wie ich Skripts schreiben, die potenzielle Fehlerbedingungen etwas ordnungsgemäß zu behandeln.

Von all Fall zuerst überprüfen

Ich stimme definitiv mit Gérards Ansatz als bevorzugte Verfahren. Jim gesagt, "Ich hasse Fehlerbehandlung schreiben"und ich stimme zu. Windows PowerShell v1 Fehlerbehandlung ist ein bit für meine Geruchs-primitive, wenn ich den Fehler vollständig vermeiden können, ich tun müssen.

Lassen Sie mich zunächst angenommen, es sind wahrscheinlich eine unbegrenzte Anzahl von Variationen auf meinen Ansatz, aber eine begrenzte Anzahl von Seiten für mich hier arbeiten, damit ich nur eine Variante werden müssen. Meine grundlegende Ziel ist es, alle Benutzerkonten zu erkennen, die bereits vorhanden sind und sich bei dem Versuch ein zweites Mal zu erstellen, anstatt diese. Um den Speicher zu aktualisieren, könnte die grundlegende Funktion Provision() wie folgt aussehen:

Function Provision {
  PROCESS {
    CreateUser $_
    CreateHomeFolder $_
    AddToGroups $_
    UpdateAttributes $_
  }
}

Pipeline eine zweite Funktion, deren Auftrag Eingaben von es ist, importieren Sie Benutzerdaten irgendwo (z. B. eine Datenbank oder eine CSV-Datei) aus und erstellen Sie eine standardisierte Hashtabelle, enthält die Attribute des neuen Benutzers erwartet die Provision-Funktion. So wäre $ _ ['Samaccountname'], z. B. den Namen des Benutzers anmelden enthalten. Angegeben, dass Benutzername – die Informationen für einen Benutzer habe nur garantiert eindeutig ist, können Sie versuchen, Sie, ob das Konto bereits vorhanden ist. Am einfachsten das Cmdlet „ Get-QADUser (verfügbar in das Cmdlet-Paket am quest.com/powershell) verwenden, so wird die Provision-Funktion wie in Abbildung 1 gezeigt geändert werden.

Abbildung 1 ändern die Provision-Funktion

Function Provision {
  PROCESS {
    $count = Get-QADUser –samAccountName $_['samaccountname'] | Measure-Object
    if ($count.count –gt 0) {
      $_['samaccountname'] | Out-File c:\not-created.txt -append
    } else {

      CreateUser $_
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
  }
  }
}

Die Änderung versucht, den angegebenen Benutzer aus dem Verzeichnis abrufen und messen die Anzahl der abgerufenen Objekte. Maßeinheit Objekt wechselt in die $ Count-Variable, die Count-Eigenschaft ($ count.count) bietet. Wenn die Anzahl größer als Null ist, dann der Benutzer vorhanden ist und Verwendung out, um den Benutzernamen an eine Protokolldatei zu übergeben. Wenn der Benutzer ist nicht vorhanden, jedoch anschließend $ Count mit nothing gefüllt wird und die Count-Eigenschaft wird nicht mehr als 0 (null) – damit ich die Bereitstellung fortzusetzen.

Dieser Ansatz – ein Benutzer zu einem Zeitpunkt überprüfen – nur durchführbar eine erhält die Möglichkeit die Provision-Funktion erstellt wird. Da der Skriptblock PROCESS nur einen einzelnen Benutzer zu einem Zeitpunkt; RuftEs gibt keine Möglichkeit dazu "Pre-loop"Um alle Benutzer zuerst zu überprüfen. Es ist wirklich nicht notwendig, allerdings da nacheinander überprüft die Leistung erheblich ändern nicht.

Ein Vorteil dieses Ansatzes über die nächsten ich vorstellen werde ist die Fehlerüberprüfung – sehen, ob der Benutzer bereits vorhanden ist – Weise erfolgt. In der Tat ist, hier der wirklich nur geeignete Ansatz, da die Funktion Provision andere Funktionen aufruft, nach dem Versuch, den Benutzer zu erstellen. Wenn nur das Erstellen ­ User Fehlerüberprüfung hinzugefügt Funktion, die anderen drei – CreateHomeFolder, AddToGroups und UpdateAttributes – möglicherweise weiterhin versuchen, auszuführen.

Oder nur mit behandeln

Aber ein anderer gültiger Ansatz ist im Allgemeinen versuchen zum Abfangen des Fehlers. Fehlerbehebung in Windows PowerShell v1 ist etwas kompliziert, aber es funktioniert ungefähr folgendermaßen:

  • Sie müssen das Cmdlet mitteilen, das möglicherweise, in einen Fehler eine tatsächliche Ausnahme generiert ausgeführt, nicht nur einen roten Fehlermeldung drucken
  • Sie müssen einen Trap definieren, wo Sie die Konsequenzen der Fehler behandeln werde

Ich tatsächlich machen diesem anspruchsvolle genug ist, zum Arbeiten mit der Funktion Provision. Die Arbeit beginnt jedoch in die CreateUser-Funktion. Irgendwo in es ist ein Cmdlet, das versucht, einen neuen Benutzer erstellen, neue QADUser, oder das New-Mailbox-Cmdlet, wenn Sie Exchange Server 2007 verwenden, um Benutzer und Postfächer auf einmal zu erstellen. In beiden Fällen fügen Sie die –ErrorAction (oder –EA) Parameters an das Cmdlet um seinen Fehler Standardverhalten zu ändern.

Sie können auch einen Trap definieren, wo die Shell tatsächlich tritt eine Ausnahme. Die Änderungen an die CreateUser-Funktion könnte wie folgt aussehen:

Function CreateUser {
  Param ($userinfo)
  Trap {
    $userinfo['samaccountname'] | Out-File c:\errors.txt -append
    break
  }
  New-Mailbox . . . -EA Stop
}

Ich habe die restlichen die Syntax für New-Mailbox nur damit in dieser Abbildung klarer weggelassen. Im Wesentlichen wenn New-Mailbox fehlschlägt, der –EA-Parameter weist er beendet und löst eine Ausnahme aus. Dies zwingt die Shell suchen Sie nach einer Auffangroutine bereits definiert und ausgeführt. In dieser Trap ich den Benutzernamen in einer Datei protokollieren und führen Sie dann eine Pause, beendet die aktuelle Funktion und übergibt den ursprünglichen Fehler zurück, an was diese Funktion aufgerufen. Anders ausgedrückt, wird die Provision-Funktion, mit dem Fehler beendet.

Damit Provision die drei Funktionen ausführen, müssen die Möglichkeit, er einen ausgeführt wird (siehe Abbildung 2) ändern.

Ändern die Provision wie in Abbildung 2 wird ausgeführt

Function Provision {
  PROCESS {
    $go = $true
    trap {
      $go = $false
      continue
    }
    CreateUser $_
    If ($go) {
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
    }
  }
}

Wie Sie sehen können, habe ich ein anderes Trap definiert. CreateUser mit einem Fehler beendet wird, wird die Auffangroutine in Provision ausgeführt. Wird einfach eine Variable, $ wechseln, auf den booleschen Wert False, und weist die Shell zum Fortfahren – d. h., Fortsetzen der Ausführung auf der Zeile, die den Fehler verursacht hat. Die Zeile ist eine "If"-Anweisung, die überprüft, wenn $ gehen enthält $ True oder nicht. Wenn dies der Fall ist, führen dann die verbleibenden drei Funktionen;Wenn $ $ False, enthält diese drei Funktionen führen. Ich den Wert $ zurücksetzen am oberen Rand der PROCESS-Skriptblock zu wechseln, so dass der nächste Benutzer versucht.

Der Grund ich ausgewählt haben, kann dieser bestimmten Ansatz (im Gegensatz zu beliebig viele andere) verwendet ist, dass dadurch mich zusätzlichen Code haben, der selbst wenn die Erstellung des Benutzers fehlgeschlagen ist (siehe Abbildung 3) ausgeführt wird.

Abbildung 3 Hinzufügen eines Anrufs zu OutputToHTML

Function Provision {
  PROCESS {
    $go = $true
    trap {
      $go = $false
      continue
    }
    CreateUser $_
    If ($go) {
      CreateHomeFolder $_
      AddToGroups $_
      UpdateAttributes $_
    }
    OutputToHTML $_
  }
}

In der Variante angezeigt wurde einen Aufruf einer Funktion mit dem Namen OutputToHTML hinzugefügt. Dies wird ausgeführt, selbst wenn der aktuelle Benutzer ist bereits vorhanden und CreateHomeFolder, AddToGroups und UpdateAttributes wurde nicht ausgeführt.

Verbesserte in Version 2

Windows PowerShell v2, die zum ersten Mal in Windows 7 ausgeliefert wird (und die werden schließlich für ältere Versionen von Windows zur Verfügung stehen), fügt neue Fehlerbehandlungs-Funktionalität, die zum Arbeiten mit ein wenig einfacher: Try … catch-Blöcke. Eine vollständige Erörterung sprengen den Rahmen dieses Artikels, damit ich nur sagen werde, dass dieses neue Feature Weitere strukturierte Fehlerbehandlung bietet, das Ihnen weitere Optionen für etwas weniger Komplexität bietet.

Don Jones ist eine von der Nation erfahrene Windows PowerShell Schulungsleiter und Schreiber. Er Blogs Tipps wöchentlichen Windows PowerShell ConcentratedTech.com;Sie können auch kontaktieren Sie ihn oder Fragen ihn vorhanden.