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 } }
MAC-Authentifizierung