Wie lege ich einen lokalen Benuterz mithilfe eines Powersehll Skript an?
Hierzu möchte ich ein Formular vwerdenden.
Folgendes habe ich erstellt:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = 'lokaler Benutzer'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,120)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = New-Object System.Drawing.Point(150,120)
$cancelButton.Size = New-Object System.Drawing.Size(75,23)
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
$form.Controls.Add($cancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'Benutzername:'
$form.Controls.Add($label)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,70)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = 'vollständiger Name:'
$form.Controls.Add($label)
$Benutzername = New-Object System.Windows.Forms.TextBox
$Benutzername.Location = New-Object System.Drawing.Point(10,40)
$Benutzername.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($Benutzername)
$Name = New-Object System.Windows.Forms.TextBox
$Name.Location = New-Object System.Drawing.Point(10,90)
$Name.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($Name)
$form.Topmost = $true
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $textBox.Text
$x
}
New-LocalUser $Benutzername -FullName $Name
2 Antworten
Bevor Du dich mit dem ganzen GUI-Schnickscnack befasst, sollten wenigstens die Basics um das erstellen eines Nutzerprofils sitzen
so die Theorie...
New-LocalUser -Name 'TestUser001' -NoPassword
...erstellt einen neuen localen Nutze ohne Passwort... macht er auch. aber er erscheint nicht im Startmenü. Im Gegensatz zum Cmd-Berfehl: net user "TestUser001" /add weist Powershell den Nutzer nicht automatisch einer Gruppe zu. und da unser neuer Nutzer keiner Gruppe angehört, weiß unser Startmenü/LoginScreen auch nicht wie Dieser zu handhaben ist.
Die Gruppen kannst Du mit Get-LocalGroup anzeigen. Relevant sind nur Administrtoren und Benutzer für Dich.
Add-LocalGroupMember -Group "Benutzer" -Member "TestUser001"
..und der Neue Nutzer erscheint im Startmenü/Anmeldebildschirm. Achtung die GruppenNamen funktionieren nur mit einem deutschen Windows!!!! (wie man dass für international macht ist hier erstmal unwichtig)
Jetzt kommt der nächste Fallstrick:
Wenn Du den FullName angibst, wird der Parameter -nopasswort ignoriert und der neue Nutzer muss bei der ersten Anmeldung ein Passwort angeben! Das kannst Du umgehen indem du den neuen Nutzer einfach mit einem leeren Passwort erzeugen lässt.
New-LocalUser -Name "TestUser002" -FullName "Test Nutzer 2" -Password ([securestring]::new())
Add-LocalGroupMember -Group "Benutzer" -Member "TestUser002"
töräääääh....
Nun wollen wir die beide Vögel auch wieder loswerden...
Remove-LocalUser -Name "TestUser001"
Remove-LocalUser -Name "TestUser002"
Nicht vergessen die Ordner der Nutzer unter C:\users\ zu löschen, falls Du dich schon mal eingeloggt haben solltest. sonst bastelt Windows wieder eigene Ordnernnamen wenn der gleiche Nutzename erneut auftaucht
Remove-Item "c:\users\TestUser001" -Recurse -Force
Remove-Item "c:\users\TestUser002" -Recurse -Force
...Soviel zum Kerngeschäft.
nun Deine GUI:
der ganze New-Object System.Drawing..... Qatsch ist Idiodie von Leuten , welche seit 15 Jahren abschreiben/pasten... Powershell erkennt selbstständig den Datentyp .Size/.Point ... einfach die Werte als String zuweisen
Ich spendiere auch noch einen Elevator-Stub, den um mit Localuser zu arbeiten benötigt man Adminrechte
#script selbständig als admin starten
if (!$([Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544')){
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-executionpolicy bypass -file "{0}" -elevated' -f $pscommandpath)
exit $LASTEXITCODE
}
#ab hier alles, was als Admin laufen soll...
'ich laufe als Admin'
Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$form.Text = 'lokaler Benutzer'
$form.Size = '300,200'
$form.StartPosition = 'CenterScreen'
$form.Topmost = $true
$label1 = New-Object System.Windows.Forms.Label
$label1.Location = '10,20'
$label1.Size = '280,20'
$label1.Text = 'Benutzername:'
$label2 = New-Object System.Windows.Forms.Label
$label2.Location = '10,70'
$label2.Size = '280,20'
$label2.Text = 'vollstaendiger Name:'
$ProfileName = New-Object System.Windows.Forms.TextBox
$ProfileName.Location = '10,40'
$ProfileName.Size = '260,20'
$FullName = New-Object System.Windows.Forms.TextBox
$FullName.Location ='10,90'
$FullName.Size = '260,20'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = '75,120'
$okButton.Size = '75,23'
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$cancelButton = New-Object System.Windows.Forms.Button
$cancelButton.Location = '150,120'
$cancelButton.Size = '75,23'
$cancelButton.Text = 'Cancel'
$cancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $cancelButton
#alle Subobjekte in einem Rutsch adden
$label1, $label2, $ProfileName, $FullName, $okButton, $cancelButton |%{$form.Controls.Add($_)}
$result = $form.ShowDialog()
#das passiert nachdem der Dialog geschlossen wurde...
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{ #Parameter aus den Inputs des Dialogs übernehmen
$params = @{
Name = $ProfileName.Text
FullName = $FullName.Text
Password = $([securestring]::new())
Description = 'Schnuffeldischneuz'
}
$Null=New-LocalUser @params
Add-LocalGroupMember -Group "Benutzer" -Member $params.Name
Get-LocalUser $params.Name |Format-List *
}
pause
...funktioniert und weil ich alles was ich hier poste auch teste... muss ich erstmal meinen Rechner mit dem Kärcher reinigen 😅😅😅
Fehlermeldung wäre sinnvoll gewesen.
Du wirst noch ein Passwort mitgeben müssen oder den "-nopassword" Parameter verwenden
nö daran liegts nicht...
$textBox.Text ist nicht definiert... ergo wir auch nix übergeben.
zudem weist New-LocalUser nicht automatisch eine Gruppenbindung zu, also existiert der neue Nutzer zwar, aber es können nur Nutzer von sichtbaren Gruppen, in der Anmeldung angezeigt werden (Administrator,Benutzer,Gast). Also wird ein neuer Nutzer eben nicht angzeigt....
siehe oben