You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell本地账户创建GUI:添加登录无需改密码复选框

解决方案

要实现“勾选复选框后创建的账户登录时无需修改密码”的功能,我们需要添加一个互斥复选框并调整用户创建逻辑,具体修改如下:

修改点说明

  1. 添加登录时无需修改密码复选框,与原有ChangePasswordAtLogon复选框互斥,避免参数冲突
  2. 优化无密码账户的联动逻辑,确保无密码账户默认登录无需改密码
  3. 更新用户创建时的参数判断,优先使用新复选框的状态设置登录改密码要求

修改后的完整代码

$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:33:31