PowerShell本地账户创建GUI:添加登录无需改密码复选框
解决方案
要实现“勾选复选框后创建的账户登录时无需修改密码”的功能,我们需要添加一个互斥复选框并调整用户创建逻辑,具体修改如下:
修改点说明
- 添加
登录时无需修改密码复选框,与原有ChangePasswordAtLogon复选框互斥,避免参数冲突 - 优化无密码账户的联动逻辑,确保无密码账户默认登录无需改密码
- 更新用户创建时的参数判断,优先使用新复选框的状态设置登录改密码要求
修改后的完整代码
$ErrorActionPreference = "Stop" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 需管理员权限,自动提权 if(!(new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())).IsInRole(544)){ start powershell -Verb runas -ArgumentList '-File',$MyInvocation.MyCommand.Definition exit } # 创建主窗体 $form = New-Object System.Windows.Forms.Form $form.Width = 500 $form.Height = 750 # 调整高度容纳新控件 $form.MaximizeBox = $false $form.TopMost = $true # 用户名输入区域 $objLabel = New-Object System.Windows.Forms.label $objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(130,15) $objLabel.BackColor = "Transparent" $objLabel.ForeColor = "Black" $objLabel.Text = "Username" $Form.Controls.Add($objLabel) $txtBox = New-Object System.Windows.Forms.TextBox $txtBox.Location = New-Object System.Drawing.Point (180, 20) $txtBox.Size = New-Object System.Drawing.Size(280,100) $form.Controls.Add($txtBox) # 密码输入区域 $objLabel2 = New-Object System.Windows.Forms.label $objLabel2.Location = New-Object System.Drawing.Size(10,50) $objLabel2.Size = New-Object System.Drawing.Size(130,15) $objLabel2.BackColor = "Transparent" $objLabel2.ForeColor = "Black" $objLabel2.Text = "Password" $Form.Controls.Add($objLabel2) $txtBox2 = New-Object Windows.Forms.MaskedTextBox $txtBox2.PasswordChar = '*' $txtBox2.Location = New-Object System.Drawing.Point (180, 50) $txtBox2.Size = New-Object System.Drawing.Size(280,100) $form.Controls.Add($txtBox2) # 密码永不过期复选框 $checkBox = New-Object System.Windows.Forms.CheckBox $checkBox.Location = New-Object System.Drawing.Point (10, 100) $checkBox.Size = New-Object System.Drawing.Size(350,30) $checkBox.Text = "PasswordNeverExpires" $form.Controls.Add($checkBox) # 用户可修改密码复选框 $checkBox2 = New-Object System.Windows.Forms.CheckBox $checkBox2.Location = New-Object System.Drawing.Point (10, 150) $checkBox2.Size = New-Object System.Drawing.Size(350,30) $checkBox2.Text = "UserMayChangePassword" $form.Controls.Add($checkBox2) # 账户永不过期复选框 $checkBox3 = New-Object System.Windows.Forms.CheckBox $checkBox3.Location = New-Object System.Drawing.Point (10, 200) $checkBox3.Size = New-Object System.Drawing.Size(350,30) $checkBox3.Text = "AccountNeverExpires" $form.Controls.Add($checkBox3) # 管理员账户复选框 $checkBox4 = New-Object System.Windows.Forms.CheckBox $checkBox4.Location = New-Object System.Drawing.Point (10, 250) $checkBox4.Size = New-Object System.Drawing.Size(350,30) $checkBox4.Text = "AdminAccount" $form.Controls.Add($checkBox4) # 无密码账户复选框 $checkBox5 = New-Object System.Windows.Forms.CheckBox $checkBox5.Location = New-Object System.Drawing.Point (10, 300) $checkBox5.Size = New-Object System.Drawing.Size(350,30) $checkBox5.Text = "noPassword" $checkbox5.Add_Click({ # 勾选无密码时禁用相关控件 $checkBox.Enabled = !$checkBox5.Checked $txtBox2.Enabled = !$checkBox5.Checked $checkbox4.Enabled = !$checkBox5.Checked # 无密码账户默认登录无需改密码 if ($checkBox5.Checked) { $checkBox7.Checked = $true $checkBox7.Enabled = $false $checkBox6.Checked = $false $checkBox6.Enabled = $false } else { $checkBox7.Enabled = $true $checkBox6.Enabled = $true } }) $form.Controls.Add($checkBox5) # 登录需修改密码复选框 $checkBox6 = New-Object System.Windows.Forms.CheckBox $checkBox6.Location = New-Object System.Drawing.Point (10, 350) $checkBox6.Size = New-Object System.Drawing.Size(350,30) $checkBox6.Text = "ChangePasswordAtLogon" $checkBox6.Add_Click({ # 与新复选框互斥 if ($checkBox6.Checked) { $checkBox7.Checked = $false $checkBox7.Enabled = $false } else { $checkBox7.Enabled = $true } }) $form.Controls.Add($checkBox6) # 新增:登录时无需修改密码复选框 $checkBox7 = New-Object System.Windows.Forms.CheckBox $checkBox7.Location = New-Object System.Drawing.Point (10, 400) $checkBox7.Size = New-Object System.Drawing.Size(350,30) $checkBox7.Text = "登录时无需修改密码" $checkBox7.Add_Click({ # 与ChangePasswordAtLogon复选框互斥 if ($checkBox7.Checked) { $checkBox6.Checked = $false $checkBox6.Enabled = $false } else { $checkBox6.Enabled = $true } }) $form.Controls.Add($checkBox7) # 创建用户按钮 $Button = New-Object System.Windows.Forms.Button $Button.Location = New-Object System.Drawing.Size(10,500) # 调整按钮位置 $Button.Size = New-Object System.Drawing.Size(150,50) $Button.Text = "create user" $Button.Add_Click({ # 选择用户组(管理员/普通用户) $group = @{$true='S-1-5-32-544';$false='S-1-5-32-545'}[$checkbox4.checked] try{ # 构建用户创建参数 $useroptions = @{ Name = $txtbox.Text Description = $txtbox.Text Fullname = $txtbox.Text AccountNeverExpires = $checkbox3.Checked UserMayNotChangePassword = !$checkbox2.Checked # 优先使用新复选框状态设置登录改密码要求 ChangePasswordAtLogon = if ($checkBox7.Checked) { $false } else { $checkBox6.Checked } } # 处理有密码/无密码逻辑 if (!$checkbox5.Checked){ $useroptions.Password = ConvertTo-SecureString $txtbox2.Text -AsPlainText -Force $useroptions.PasswordNeverExpires = $checkbox.Checked }else{ $useroptions.NoPassword = $true $group = 'S-1-5-32-545' } # 创建用户并添加到对应组 New-LocalUser @useroptions | Add-LocalGroupMember -Group (Get-Localgroup | ? Sid -eq $group) [System.Windows.Forms.MessageBox]::Show("User has been created successfully.","User created",0,64) }catch{ [System.Windows.Forms.MessageBox]::Show("Error creating new user account:`n $($_.Exception.Message)","Exception",0,48) } }) $form.Controls.Add($Button) # 显示窗体 [void]$form.ShowDialog()
关键逻辑说明
- 新复选框与
ChangePasswordAtLogon互斥,勾选其中一个时另一个会被禁用并取消勾选,避免参数冲突 - 当勾选
noPassword时,自动勾选新复选框并禁用两个密码相关的登录设置复选框,符合无密码账户的使用逻辑 - 在创建用户时,优先判断新复选框的状态,若勾选则设置
ChangePasswordAtLogon = $false,确保登录时无需修改密码
内容的提问来源于stack exchange,提问作者chkdsk
相关产品推荐
相关产品推荐

