User via Powershell CSV anlegen Problem
Hallo zusammen. Ich habe vor ca. 2 Jahren mal nen Script aus diversen einzelnen Scripten zusammengebaut. Das Funktionierte auch soweit immer. Wollte es jetzt mal auf S2019 laufen lassen.
Problem, es erscheint plötzlich die Meldung:
Hier mal das ganze Script. Kann mir jemand helfen?
Die CSV sieht so aus:
Problem, es erscheint plötzlich die Meldung:
Die Eigenschaft "Implement" wurde für dieses Objekt nicht gefunden. Vergewissern Sie sich, dass
die Eigenschaft vorhanden ist.
In C:\Users\Administrator\Desktop\Benutzer Test.ps1:63 Zeichen:9
+ If (($_.Implement.ToLower()) -eq "yes")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: ( : ) , PropertyNotFoundException
+ FullyQualifiedErrorId : PropertyNotFoundStrict
Hier mal das ganze Script. Kann mir jemand helfen?
Set-StrictMode -Version latest
#----------------------------------------------------------
# LOAD ASSEMBLIES AND MODULES
#----------------------------------------------------------
Try
{
Import-Module ActiveDirectory -ErrorAction Stop
}
Catch
{
Write-Host "[ERROR]`t ActiveDirectory Module couldn't be loaded. Script will stop!"
Exit 1
}
#----------------------------------------------------------
#STATIC VARIABLES
#----------------------------------------------------------
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$newpath = $path + "\benutzer.csv"
$log = $path + "\create_ad_users.log"
$date = Get-Date
$domaene_dn = (Get-ADDomain).DistinguishedName
$domaene_OU = Get-ADOrganizationalUnit -Filter "name -eq 'FIRMA'"
$dnsroot = (Get-ADDomain).DNSRoot
$i = 1
#----------------------------------------------------------
#START FUNCTIONS
#----------------------------------------------------------
Function Start-Commands
{
Create-Users
}
Function Create-Users
{
"Processing started (on " + $date + "): " | Out-File $log -append
"--------------------------------------------" | Out-File $log -append
Import-CSV $newpath -Encoding UTF8 | ForEach-Object {
If (($_.Implement.ToLower()) -eq "yes")
{
If (($_.Vorname -eq "") -Or ($_.Nachname -eq "") -Or ($_.Benutzername -eq ""))
{
Write-Host "[ERROR]`t Please provide valid GivenName, LastName und SamAccountName. Processing skipped for line $($i)`r`n"
"[ERROR]`t Please provide valid GivenName, LastName and SamAccountName. Processing skipped for line $($i)`r`n" | Out-File $log -append
}
Else
{
# Set the target OU
$location = "OU=" + $_.ZielOU + ",$($domaene_OU)"
$GroupMember = "CN=" + $_.ZielOU, ",OU=Security Groups" + ",$($domaene_OU)"
# Set the Enabled and PasswordNeverExpires properties
If (($_.Enabled.ToLower()) -eq "true") { $enabled = $True } Else { $enabled = $False }
If (($_.PasswordNeverExpires.ToLower()) -eq "true") { $expires = $True } Else { $expires = $False }
# Replace dots / points (.) in names, because AD will error when a
# name ends with a dot (and it looks cleaner as well)
$replace = $_.Nachname.Replace(".","")
If($replace.length -lt 4)
{
$lastname = $replace
}
Else
{
$lastname = $replace.substring(0,4)
}
# Create sAMAccountName:
$sam = $_.Benutzername
Try { $exists = Get-ADUser -LDAPFilter "(sAMAccountName=$sam)" }
Catch { }
If(!$exists)
{
$setpass = ConvertTo-SecureString -AsPlainText $_.Password -force
Try
{
Write-Host "[INFO]`t Creating user : $($sam)"
"[INFO]`t Creating user : $($sam)" | Out-File $log -append
New-ADUser $sam -GivenName $_.Vorname `
-Surname $_.Nachname -DisplayName ($_.Vorname + $_.Nachname) `
-UserPrincipalName ($sam + "@" + $dnsroot) -AccountPassword $setpass `
-profilePath $_.ProfilPfad -scriptPath $_.ScriptPfad -homeDirectory $_.HomeVerzeichnis `
-homeDrive $_.HomeLaufwerk -Enabled $enabled -PasswordNeverExpires $expires
Write-Host "[INFO]`t Created new user : $($sam)"
"[INFO]`t Created new user : $($sam)" | Out-File $log -append
$dn = (Get-ADUser $sam).DistinguishedName
# Move the user to the OU ($location) you set above. If you don't
# want to move the user(s) and just create them in the global Users
# OU, comment the string below
If ([adsi]::Exists("LDAP://$($location)"))
{
Move-ADObject -Identity $dn -TargetPath $location
# Benutzer der angegebenen Gruppe hinzufuegen
$USER=Get-ADUser -Filter * -Searchbase $domaene_OU
Add-ADGroupMember $GroupMember -Members $USER
Write-Host "[INFO]`t User $sam moved to target OU : $($location)"
"[INFO]`t User $sam moved to Group : $($location)" | Out-File $log -append
Write-Host "[INFO]`t User $sam added to Group : $($GroupMember)"
"[INFO]`t User $sam added to Group : $($GroupMember)" | Out-File $log -append
}
Else
{
Write-Host "[ERROR]`t Targeted OU couldn't be found. Newly created user wasn't moved!"
"[ERROR]`t Targeted OU/Group couldn't be found. Newly created user wasn't moved!" | Out-File $log -append
}
$newdn = (Get-ADUser $sam).DistinguishedName
Rename-ADObject -Identity $newdn -NewName ($_.Vorname + " " + $_.Nachname)
Write-Host "[INFO]`t Renamed $($sam) to $($_.Vorname) $($_.Nachname)`r`n"
"[INFO]`t Renamed $($sam) to $($_.Vorname) $($_.Nachname)`r`n" | Out-File $log -append
}
Catch
{
Write-Host "[ERROR]`t Oops, something went wrong: $($_.Exception.Message)`r`n"
}
}
Else
{
Write-Host "[SKIP]`t User $($sam) ($($_.Vorname) $($_.Nachname)) already exists or returned an error!`r`n"
"[SKIP]`t User $($sam) ($($_.Vorname) $($_.Nachname)) already exists or returned an error!" | Out-File $log -append
}
}
}
Else
{
Write-Host "[SKIP]`t User ($($_.Vorname) $($_.Nachname)) will be skipped for processing!`r`n"
"[SKIP]`t User ($($_.Vorname) $($_.Nachname)) will be skipped for processing!" | Out-File $log -append
}
$i++
}
"--------------------------------------------" + "`r`n" | Out-File $log -append
}
Write-Host "STARTED SCRIPT`r`n"
Start-Commands
Write-Host "STOPPED SCRIPT"
Die CSV sieht so aus:
Implement;Vorname;Nachname;Benutzername;ProfilPfad;ScriptPfad;HomeVerzeichnis;HomeLaufwerk;Password;PasswordNeverExpires;TargetOU;enabled
yes;Tony;Tester;tester;\\test\Profiles\%username%; ;H;\\test\Home\%username%;test123;yes;Mitarbeiter;yes;
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 592420
Url: https://administrator.de/contentid/592420
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
14 Kommentare
Neuester Kommentar
Semikolon am Ende der zweiten Zeile der CSV zu viel (zwar nicht so tragisch wenn dahinter nichts mehr kommt, aber unschön) und viel wichtiger: es fehlt die Angabe des Delimiters bei Import-CSV.
Import-CSV $newpath -Encoding UTF8 -Delimiter ";" | ...............
Powershell kann nichts mit der cmd-batch syntax anfangen, wenn du den usernamen in Powershell haben willst, lautet die Environment Variable:
More on this:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Happy Sysadmin Day, Prost
$env:username
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Happy Sysadmin Day, Prost
Das macht, wenn man es per GUI macht die MMC für den User.
Ich meine er schreibt es ja richtig in den Benutzer rein nur wird dies nicht umgewandelt.
Weil wenn du das per Skript machst es keine Automatik gibt.Heißt ich müsste ins Script eine zusätzliche Convertierung einbinden?
Nö gleich den richtigen Wert zuweisen:"\\SERVER\Profiles`$\$($_.Sam)"
Zitat von @Wild-Wolf:
Einzige Problem. Wenn ich nun einen User Kopiere und daraus einen neuen mache, kopiert er ja dummerweise den "festen" namen mit und nicht mehr %username%.
Dafür hast du ja Skripte .Einzige Problem. Wenn ich nun einen User Kopiere und daraus einen neuen mache, kopiert er ja dummerweise den "festen" namen mit und nicht mehr %username%.
Btw. geht es auch ohne die Variable, beim Kopieren erkennt Windows automatisch den SamAccountName am Pfadende und ersetzt diesen durch den neuen Ergo=> Umgebungsvariable fürs Kopieren überflüssig.
$sam = $_.Vorname + "." + $_.Nachname
p.s. Mir fällt da gerade noch ein das ich ein Kasten Bier brauche, kannst du das dann bitte für mich erledigen?! .