wild-wolf
Goto Top

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:

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;

Content-Key: 592420

Url: https://administrator.de/contentid/592420

Printed on: April 19, 2024 at 15:04 o'clock

Mitglied: 145033
Solution 145033 Jul 31, 2020 updated at 11:35:22 (UTC)
Goto Top
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 ";" | ...............  
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 11:36:09 (UTC)
Goto Top
... Habe es gerade gemerkt ... ey sowas simples ...

Eine Frage noch. Ich will ja auch die Pfade via Script setzen lassen:

\\SERVER\Profiles$\%username% > \\SERVER\Profiles$\tonitester

Dummerweise steht nach dem anlegen unter Home und Profil immer %username% da und nicht der Name. Kann man das irgendwie auch lösen?
Member: NetzwerkDude
NetzwerkDude Jul 31, 2020 at 12:05:23 (UTC)
Goto Top
Powershell kann nichts mit der cmd-batch syntax anfangen, wenn du den usernamen in Powershell haben willst, lautet die Environment Variable:
$env:username

More on this:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Happy Sysadmin Day, Prost
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 12:14:20 (UTC)
Goto Top
Kann Windows das nachdem Eintragen nicht selbst umsetzen?
Ich meine er schreibt es ja richtig in den Benutzer rein nur wird dies nicht umgewandelt.

Heißt ich müsste ins Script eine zusätzliche Convertierung einbinden?

And Happy Sysadmin Day too
Mitglied: 145033
Solution 145033 Jul 31, 2020 updated at 12:36:09 (UTC)
Goto Top
Zitat von @Wild-Wolf:

Kann Windows das nachdem Eintragen nicht selbst umsetzen?
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)"  
Member: NetzwerkDude
NetzwerkDude Jul 31, 2020 updated at 12:32:43 (UTC)
Goto Top
Ach sorry, ich hab zuviel Bier intus - geht ja um die Eigenschaft:
Naja, da musst deinen Code einfach anpassen:
Zeile 86
--profilePath "\\test\Profiles\"+$_.sam  
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 12:37:48 (UTC)
Goto Top
Also ich tät auch eines nehmen tun :D

Ok das funktioniert danke.

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%. Ich glaube man kann nicht alles haben .
Mitglied: 145033
145033 Jul 31, 2020 updated at 12:40:04 (UTC)
Goto Top
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 face-wink.
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 12:41:29 (UTC)
Goto Top
DAS muss ich ja noch meinen Kollegen dann beibringen :D
Mitglied: 145033
Solution 145033 Jul 31, 2020 updated at 13:12:01 (UTC)
Goto Top
Zitat von @Wild-Wolf:

DAS muss ich ja noch meinen Kollegen dann beibringen :D
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.
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 14:37:20 (UTC)
Goto Top
Mir fällt da gerade noch was ein.
Kann ich in dem Script sagen, er soll automatisch für den Benutzer Toni Teaster als Benutzername z.B. T.Tester machen?
Wäre eine Zeile weniger im CSV
Mitglied: 145033
Solution 145033 Jul 31, 2020 updated at 14:39:31 (UTC)
Goto Top
$sam = $_.Vorname + "." + $_.Nachname  
Mitglied: 145033
145033 Jul 31, 2020 updated at 14:45:13 (UTC)
Goto Top
Zitat von @Wild-Wolf:

Mir fällt da gerade noch was ein.
p.s. Mir fällt da gerade noch ein das ich ein Kasten Bier brauche, kannst du das dann bitte für mich erledigen?! face-smile.
Member: Wild-Wolf
Wild-Wolf Jul 31, 2020 at 14:58:07 (UTC)
Goto Top
Ach misst hatte "." vergessen.
Danke