Veraltete Computerkonten im Active Directory finden

Problem

Eine wiederkehrende und frustrierende Verwaltungsaufgabe für das Active Directory ist, alte Computerkonten (Server, Desktop-PCs, Laptops … ) sauber zu entfernen. Viele Admins fügen eigentlich immer nur hinzu, alte Konten werden nicht aufgeräumt. Einen eingebauten Automatismus dafür gibt es nicht.

Ein Blick auf die Registerkarte „Objekt“ eines Computerkontos zeigt zwar, wann die Update-Sequenznummer (USN) aktualisiert wurde, aber nicht wann sich der Computer das letzte mal bei der Domäne angemeldet hat.

Lösung

Es gibt verschiedene Möglichkeiten, um festzustellen, ob ein Computerkonto in Active Directory veraltet ist. Der empfohlene („Best Practice“) Ansatz besteht darin, eine Richtlinie für Ihre Active Directory-Domäne einzurichten, in der die Regeln erläutert werden. Das Problem dabei sind aber remote-Systeme, wie zum Beispiel ein Laptop, wo der entsprechende Benutzer in der Lage ist, alles zu tun, was er über eine Webanwendung benötigt.

Inaktive Computer im AD mit dsquery suchen

C:\> dsquery computer -inactive <WOCHEN>

Der Befehl wird so für die gesamte Domäne (des ausführenden Computers) ausgeführt. Einschränkungen sind aber möglich:

C:\> dsquery computer OU=Hiersuchen,DC=domain,DC=local -inactive <WOCHEN>

Leider kann dsmove nicht mit dieser Liste direkt gepiped werden, da ist die Powershell etwas komfortabler. Um also ältere Computer in eine eigene OU zu verschieben, ist an der CMD-Shell ein Dreizeiler erforderlich:

dsquery computer -inactive <WOCHEN> > liste.txt
FOR /f %%i in (liste.txt) do dsmove %%i -newparent OU=<INACTIVE-OU>,DC=domain,DC=local
del liste.txt

 

 

Inaktive Computer im AD mit der PowerShell suchen

Das geht sogar in Tagen, nicht nur in Wochen. Dafür muss die Variable entsprechend geändert werden (-60).

PS C:\> $then = (Get-Date).AddDays(-60)
PS C:\> Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $then}

Die ausgegebenen Objekte lassen sich so direkt weiterpipen.

Mehr Beispiele an der Powershell

# Ausgabe veralteter Computerkonten als halbwegs sinnvolle Liste
PS C:\> Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $then} | Sort-Object -Property "lastLogonDate" | FT Name,lastLogonDate
# Veraltete Computerkonten im AD deaktivieren
PS C:\> Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $then} | Set-ADComputer -Enabled $false
# Veraltete Computerkonten im AD löschen
PS C:\> Get-ADComputer -Property Name,lastLogonDate -Filter {lastLogonDate -lt $then} | Remove-ADComputer

 

Ein neues VLAN über den vCenter-Server zu einem oder allen ESXi-Hosts im Cluster hinzufügen

Man fügt ja eine neu getaggte VLAN Portgruppen zur Segementierung auf jedem ESXi-Host einzeln zum vSwitch hinzu, es sei denn man verfügt üben den zentralisierten NSX/Distributed-Luxus. Oder macht gleich SDN überall 🙂

Der Vorgang an sich kann je nach Clustergröße etwas dauern und zudem sehr ermüdent sein. Das folgende PowerCLI-Script vereinfacht diese Arbeit deutlich und erledigt den Job in wenigen Sekunden.

„Stelle ein neues VLAN unserer Switches am bestehenden vSwitch ALLER Hosts zur Verfügung“

PowerCLI C:\> Connect-VIServer vcenter01.localnetwork.local
PowerCLI C:\> get-cluster -name MEINSEXYCLUSTER | Get-VMHost | Get-VirtualSwitch -name "vSwitch1" | New-VirtualPortGroup -Name "NEUES_SEXY_SEGMENT_LAN33" -VLanId "1607"

„Stelle ein neues VLAN unserer Switches am bestehenden vSwitch an EINEM Hosts zur Verfügung“

PowerCLI C:\> Connect-VIServer vcenter01.localnetwork.local
PowerCLI C:\> get-cluster -name MEINSEXYCLUSTER | Get-VMHost SEXYHOSTNAME | Get-VirtualSwitch -name "vSwitch1" | New-VirtualPortGroup -Name "NEUES_SEXY_SEGMENT_LAN33" -VLanId "1607"

„Entferne ein VLAN an den bestehenden vSwitches ALLER Hosts“

PowerCLI C:\> Connect-VIServer vcenter01.localnetwork.local
PowerCLI C:\> get-cluster -name "MEINSEXYCLUSTER " | Get-VMHost | Get-VirtualSwitch -name "vSwitch1" | Get-VirtualPortGroup -Name "NEUES_SEXY_SEGMENT_LAN33" | Remove-VirtualPortGrou

PowerCLI rockt einfach. Mehr zum Thema:

Ressourcenpostfach Kalenderbuchungen automatisch akzeptieren um Konflikte zu vermeiden

Problem:

Ein Ressourcenpostfach (Gerätepostfach) soll Kalenderbuchungen automatisch akzeptieren. In der Standardeinstellung sind Konflikte bei der Buchung möglich.

Lösung:

Standardmäßig werden bei Gerätepostfächern Kalenderbuchungen zwar als „Mit Vorbehalt“ im Kalender eingetragen, allerdings nicht automatisch bestätigt. Somit sind auch doppelte Buchungen möglich.

Diese Einstellung lässt sich relativ schnell via Exchange-Management-Shell ändern:

Set-CalendarProcessing -Identity "POSTFACH" -AutomateProcessing AutoAccept

Kalenderdetails eines Ressourcenpostfaches anzeigen (Exchange 2016/Online)

Problem:

Benutzer sehen im Kalender eines Ressourcenpostfaches standardmäßig lediglich den Frei-/Gebucht-Status und können Termine auch nicht zum anzeigen von Details öffnen.

Lösung:

Es gibt mehrere Möglichkeiten dies zu ändern:

  1. Einem Benutzer Vollzugriff auf das Ressourcenpostfach geben (via EMC). Mit diesem Benutzer können dann die Berechtigungen des Kalenders vom betroffenen Postfach angepasst werden. Oder:
  2. Die Kalenderberechtigungen für den „Default“-Benutzer via Exchange-Management-Shell anpassen:
Set-MailboxFolderPermission "POSTFACH-ID:\Kalender" -AccessRights Reviewer -User Default

Die Rolle „Reviewer“ behinhaltet die Berechtigungen „FolderVisible, ReadItems“, somit also auch das Anzeigen der Termindetails.
Die anderen möglichen Berechtigungen bzw. Rollen finden sich unter https://technet.microsoft.com/de-de/library/dd298062(v=exchg.160).aspx

Office 365 Powershell Download/Setup/Installation

Die Windows PowerShell für Office 365 ist ein sehr leistungsfähiges Tool. Erweiterbar wie ein IBM Universal  Business Adapter und in etwa auch so komplex. Es gibt einen Punkt in der Lernkurve, an dem Anfänger häufig den Faden verlieren; dies passiert in der Regel nach dem Erlernen der einfachsten Cmdlets und bevor die Erstellung nützlicher Lösungen vollständig verstanden worden ist. Es ist eine einfache Sache „Get-Process“ auszuführen, aber eine andere eine Reihe von Cmdlets in eine Pipeline für einen Remotecomputer einzureihen, um eine Aktion remote auszuführen. Grade Office 365 ist beispielsweise nicht vollständig in die „Ausliefershell“ integriert und benötigt einige zusätzliche Module und die Initialisierung der Remote-Shell.

So gehts auf in die Office 365 Powershell

  1. Betriebssysteme unter Windows7/2008R2 brauchen WinRM2.0 mit der Powershell 2.0
  2. Download und Installation Microsoft Online Services Sign-in Assistant
  3. Download und Installation Azure Active Directory (AD) Module (x64, eine 32-bit-VErsion gibt es noch, wird aber nicht mehr supported)
  4. Optional: „SharePoint Online Module“ (Zur Sharepoint-Verwaltung)
  5. Optional: „Skype for Business Online Module“ (Zur Lync Skype for Business Verwaltung)

Verbindung zur Office 365 Powershell

$credential = get-credential
Import-Module MSOnline
Connect-MsolService -Credential $credential

Verbindung zur Skype for Business Powershell

Import-Module LyncOnlineConnector
$lyncSession = New-CsOnlineSession -Credential $credential
Import-PSSession $lyncSession

Verbindung zur Sharepoint Powershell

Import-Module Microsoft.Online.Sharepoint.PowerShell
Connect-SPOService -url https://contoso-admin.sharepoint.com -Credential $credential

Verbindung zur Exchange Powershell

$ExchangeSession = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://outlook.office365.com/powershell-liveid/" -Credential $credential -Authentication "Basic" -AllowRedirection
Import-PSSession $ExchangeSession

Verbindung zu den Office 365 Onlinediensten via Poweshell-Function

function Connect-O365 {
<#
.Synopsis
 Connects powershell to Office 365
.DESCRIPTION
 Use this to connect powershell to Office 365. You will be prompted for credentials.
.EXAMPLE
 Connect-O365
#>
 Set-ExecutionPolicy RemoteSigned
 $Cred = Get-Credential
 $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection
 Import-Module (Import-PSSession $Session -Allowclobber) -Global
 Connect-MsolService -Credential $Cred
}

(Danke Alex)

Powershell Skripts als geplante Tasks in der Aufgabenplanung starten

Powershell-Script lassen sich an der (Powershell-) Kommandozeile komfortabel starten, jedoch nicht ohne weiteres in geplanten Tasks.

Das geht so:
powershell-aufgabenplanung-startenFeld Programm/Script:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe

Argumente:

-noninteractive -command "&{C:\PFAD\SCRIPTNAME.ps1}"

Mehr Details dazu hat das MSDN in diesem Artikel, aber im Prinzip ist es das schon.

PowerShell: Gruppen aus dem ActiveDirectory mit ihren Mitgliedern auflisten

Problem

Eine Management-Anforderung:

Bitte erstellen sie mal eben eine Liste alle Gruppen aus unserem ActiveDirectory mit allen Mitgliedern darin. Oh, am besten sowohl der DisplayName und auch der ganze LDAP-Pfad – und wenn es verschachtelte Gruppen, gibt nur den Gruppennamen.

Lösung

Der finde Admin weiss: So eine Liste ist, einmal erstellt, recht statisch und daher über die Zeit mehr und mehr realitätsfern, aber das zu erstellen ist natürlich ein Problem. Die Ausgabe ist natürlich ein schneller Hack, der erfahrene Admin baut selbstverständlich besser erst ein Objekt zusammen und wendet auf dessen Eigentschaften eine ausgabemethode an.

$Groups = Get-ADGroup -Properties * -Filter *
Foreach($G In $Groups) {
    $G.Name         | Out-File -Append .\gruppenliste.txt
    "---------------------" | Out-File -Append .\gruppenliste.txt
    $G.Members      | Out-File -Append .\gruppenliste.txt
    }

Die Gruppenliste liße sich selbstverständlich auch Filtern, zum Beispiel „Nur Gruppen die ‚rothaarig‘ im Namen haben“:

# $Groups = Get-ADGroup -Properties * -Filter {name -like "*rothaarig*"}

Powershell Fehler „0x80131515“ beim laden von Modulen (Import-Module)

Problem

Ein neues Powershell Modul oder Script möchte nicht geladen werden, stattdessen gibt es den Fehler:

Import-Module : Die Datei oder Assembly 
"file:///C:\Windows\system32\WindowsPowerShell\v1.0\Modules\NTFSSecurity\FOOBARNAME.dll" oder eine Abhängigkeit davon 
wurde nicht gefunden. Der Vorgang wird nicht unterstützt. (Ausnahme von HRESULT: 0x80131515)
In Zeile:1 Zeichen:1
+ Import-Module NTFSSecurity
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-Module], FileLoadException
    + FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.ImportModuleCommand

Lösung

  1. .NET Framework 2.0 Installieren
    Install-WindowsFeature Net-Framework-Core -source \\HOST\PFAD\sxs
  2. NTFS-Feature „Zulassen“ auf den entsprechenden Dateien aktivieren
  3. Die gute alte Execution-Policy anpassen
    Set-ExecutionPolicy Unrestricted

Warum die ansonsten zu überaus clevere Scripting Guys allerdings ein „Datei nicht gefunden“ an dieser Stelle ausgeben ist uns ein Rätsel.