Nützliche WMI-Filter für GPOs

Nur Clients ( also keine Server Systeme und keine DCs)

select * from Win32_OperatingSystem Where ProductType=1

 

Nur Clients Win7 und neuer

SELECT * FROM Win32_OperatingSystem WHERE BuildNumber >= 7600 AND ProductType = 1

 

Notebooks

select * from Win32_ComputerSystem where PCSystemType = 2

 

Nur Server 2008R2 und neuer (inkl. DCs)

SELECT * FROM Win32_OperatingSystem WHERE BuildNumber >= 7600 AND ProductType >= 2

 

…to be continued

AD Recycle Bin – Der Papierkorb vom AD

So wird er aktiviert und benutzt
(wie immer die Kurzform)

Ausführliche Erklärung gibt es hier: https://technet.microsoft.com/de-de/library/dd379481(v=ws.10).aspx

Der folgende Befehl ist so gemacht, dass er einfach per Copy-Paste in ein Powershell-Fenster kopiert werden kann und ohne weitere Änderungen läuft. „AD Recycle Bin – Der Papierkorb vom AD“ weiterlesen

MAC-Authentifizierung

In manchen Fällen benötigt man Accounts für Netzwerkgeräte die per Radius (802.1x) im Netz authentifiziert werden sollen. Mit folgendem Skript können einzelne Geräte per Parameter oder mehrere per CSV-Datei erstellt werden.

#------------------------------------------------------------------------------#
# Skript zum erstellen von Accouts für Netzwerkgeräte die über den Radius per 
# MAC-Adresse authentifiziert werden müssen
# Autor: Rob   	        8.8.2013
#------------------------------------------------------------------------------#
# Changelog:
# Datum			Änderung
# 	
#------------------------------------------------------------------------------#
param
	(
	[string]$File,
	[string]$Name,
	[string]$MAC,
	[string]$OU="MACAUTH",
	[string]$DN="OU=Clients,DC=MyDomain,DC=Local",
	[string]$Gruppe="MACAUTH_CLIENT",
	[switch]$DEBUG
	)
#------------------------------------------------------------------------------#
# Die Datei muss ein CSV-File mit folgender Struktur sein:
#------------------------------------------------------------------------------#
# Name,MAC,OU,Gruppe
# Tel0005,081508150818,XYZ,MACAUTH_CLIENT
#------------------------------------------------------------------------------#
 
#region Script Diagnostic Functions 
 
function Get-CurrentLineNumber {
    $MyInvocation.ScriptLineNumber
}
 
New-Alias -Name __LINE__ -Value Get-CurrentLineNumber –Description ‘Returns the current line number in a PowerShell script file.‘
 
function Get-CurrentFileName {
    $MyInvocation.ScriptName
}
 
New-Alias -Name __FILE__ -Value Get-CurrentFileName -Description ‘Returns the name of the current PowerShell script file.‘
 
#endregion
 
 
 
$error.clear()	# Fehlerbehandlung
 
if ( $File -eq "" )	# Keine Datei Angegeeben
	{
	if ( $Debug ) { Write-host "No File" }
	if ( $MAC -eq "" -or $Name -eq "" ) # Beide müssen angegeben sein
		{
		Write-warning "$(__Line__): Es muss entweder eine Datei oder Name und MAC-Adresse angegeben werden!"
		exit
		}
	else	# MAC prüfen
		{
		$MAC = $MAC -replace "([^a-f0-9])"
		if ( $MAC.Length -ne 12 )
			{
			write-warning "$(__Line__): MAC Adresse ungültig bei $Name ( $MAC )"
			exit
			}
		}
	$Accounts = ""
	$Accounts = $Accounts | add-member -membertype noteproperty -name MAC -value $MAC -passthru
	$Accounts = $Accounts | add-member -membertype noteproperty -name Name -value $Name -passthru
	if ( $Gruppe -ne "" )
		{
		if ( $Debug ) { write-host "Gruppe per Komandozeile:" $Gruppe }
		$Accounts = $Accounts | add-member -membertype noteproperty -name Gruppe -value $Gruppe -passthru
		}
	}
else					# Datei angegeben
	{
	if ( $MAC -ne "" -or $Name -ne "" ) # Keiner darf angegeben sein
		{
		Write-warning "$(__Line__): Es muss entweder eine Datei oder Name und MAC-Adresse angegeben werden!"
		exit
		}
	if ( -not (test-path $file) )
		{
		write-warning "$(__Line__): Gültigen Dateinamen angeben!"
		exit
		}
	$TMP1 = get-content $file
	if ( $TMP1.count -lt 1 )
		{
		write-warning "$(__Line__): Die Datei ist leer oder nicht lesbar"
		exit
		}
	Remove-Item $file -force -confirm:$false
	foreach ( $TMP2 in $TMP1 )
		{
		$TMP2 = $TMP2.trim()
		if ( $TMP2.length -ne 0 )
			{
			$TMP2 | out-file -FilePath $file -Append
			}
		}
 
	$Accounts = import-csv $file -Delimiter "`t" | Select @{Name="Name";Expression={$_."Hostname"}}, @{Name="MAC";Expression={$_."MAC-Adresse"}}, @{Name="OU";Expression={$_."AD-OU"}}
	}
 
if ( $error.count -ne 0 )
	{
	write-warning "$(__Line__): Abbruch wegen Fehler!"
	exit
	}
 
foreach ( $Account in $Accounts )
	{
	$MAC = $Account.MAC -replace "([^a-f0-9])"
	$Name = $Account.Name
	if ( $Debug ) { write-host $Name `t $MAC }
	if ( $MAC.Length -ne 12 )
		{
 
		write-warning "$(__Line__): MAC Adresse ungültig bei $Name ( $MAC )"
		exit
		}
 
	$Probe = Get-ADUser -Filter { (SamAccountName -eq $MAC ) -or (Name -eq $Name) -or (DisplayName -eq $Name)}
	if (( $Probe | measure).count -ne 0 )
		{
		write-warning "$(__Line__): Ein Objekt mit dem Namen $Name oder $MAC existiert bereits!"
		if ( $file -ne "" ) { Write-warning "Es wurde kein neuer Account angelegt!" }
		write-host "Vorhandenes Objekt:" $Probe
		exit
		}
	}
 
foreach ( $Account in $Accounts )
	{
	$MAC = $Account.MAC.toupper() -replace "([^a-f0-9])"
	$Name = $Account.Name
	$PWD = ConvertTo-SecureString -String $MAC.tolower() -asplaintext -force
	if ( $Account.OU )
		{
		$MACDN = "OU=" + $Account.OU + "," + $DN
		}
	else
		{
		$MACDN = $DN
		}
	$Probe = ( Get-ADObject -Filter { ( DistinguishedName -eq $MACDN ) } )
	if ( ( $Probe | measure).count -eq 0 )
		{
		write-warning "$(__Line__): Der Distinguished Name ( $MACDN ) ist ungültig!"
		exit
		}
	$TMP1 = "OU=" + $OU + "," + $MACDN
	$Probe = ( Get-ADObject -Filter { ( DistinguishedName -eq $TMP1 ) } )
	if ( ( $Probe | measure).count -eq 0 )
		{
		New-ADOrganizationalUnit -Name $OU -Path $MACDN -ProtectedFromAccidentalDeletion $true -Description "Objekte die per MAC authentifiziert werden: Drucker oder Apple Mac"
		}
	$MACDN = $TMP1
	if ( $Debug ) { write-host "DN:" $MACDN }
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
 
	New-ADuser -Enabled $true -PasswordNeverExpires $true -AllowReversiblePasswordEncryption $true -CannotChangePassword $true -Path $MACDN -SamAccountName $MAC -DisplayName $Name -Name $Name -AccountPassword $PWD
	$MACDN = ( Get-ADUser $MAC ).DistinguishedName
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		write-warning "Accout: $MAC `t DN: $MACDN"
		exit
		}
 
	if ( -not $Gruppe )
		{
		$Gruppe = $Account.Gruppe
		}
	if ( $Debug ) { write-host "Gruppe:" $Gruppe }
	$SID = (((Get-ADGroup $Gruppe).SID).Value.tostring())
	$SID = $SID.substring($SID.LastIndexOf("-")+1)
	if ( $Debug ) { write-host $Gruppe `t $SID }
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
	Add-ADGroupMember $Gruppe $MAC
	Set-ADObject -Identity $MACDN -Replace @{primaryGroupID="$SID"}
 
	sleep 1
	Remove-ADGroupmember "Domänen-Benutzer" -Member $MAC -confirm:$false
 
	if ( $error.count -ne 0 )
		{
		write-warning "$(__Line__): Abbruch wegen Fehler!"
		exit
		}
	}

 

Migrate Contacts across Organization

Heute habe ich in einer Testumgebung Migrationen getestet.

Die Testumgebung bestand aus zwei Forests. Verbunden mit transitiven, bidirektionalen Forest-Trusts.
Ich hab dann munter mit ADMT 3.2 migriert: Benutzer, Gruppen PCs und mit Exchange Bordmitteln auch die Postfächer.
Dann wollte ich die Kontakte migrieren und habe nichts gefunden. Nur extrem komplizierte Installationsanleitungen oder teure Software.

Meine Kontakte wurde hauptsächlich wegen eMail verwendet.

Ich hab dann mein Lieblingstool gestartet: Powershell.exe 🙂

$C = Get-ADObject -LDAPFilter "(objectClass=contact)" -Server dc-2.powershell_pub.lan

$C | foreach {
New-MailContact -Name $_.Name -ExternalEmailAddress ($_.targetAddress.Split(':'))[1] -OrganizationalUnit "OU=Contact,DC=powershell_pub,DC=local"
}

Wenn man noch andere Infos migrieren will,  braucht man nur die entsprechenden Infos per Variable in die entsprechenden Parameter „einfüllen“