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