PowerShell带GUI的密码重置脚本三项功能优化问题咨询
PowerShell GUI密码重置脚本优化方案
以下是针对你提出的三个需求的完整实现代码,所有功能均已适配你的使用场景:
已实现的优化点
- 输入框为空时自动禁用OK按钮,仅当输入内容(RFID扫描完成)时启用按钮,完全兼容扫描后自动触发回车的逻辑
- 主表单始终保持打开状态,点击OK不会关闭主窗口;弹出的提示框独立显示在主窗口上层,绑定15秒倒计时自动关闭,关闭后自动清空输入框、恢复待扫描状态,支持多用户连续使用
- 提示框支持完全自定义样式,可和主表单配置统一的背景色、文字颜色、大小等样式参数
完整代码
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 导入CSV用户数据 # 注意:如果你的CSV文件本身已包含First,Second等表头行,请删除下面的-Header参数,避免表头被识别为用户数据 $Spreadsheet = Import-CSV "C:\Desktop\Password Reset\Passwords.csv" -Header First,Second,Username,Password,RFID # 创建主表单 $form = New-Object System.Windows.Forms.Form $form.Text = '密码重置系统' $form.Size = New-Object System.Drawing.Size(800,600) $form.StartPosition = 'CenterScreen' $Form.BackColor = "#A4F9F4" $Form.ForeColor = "#000000" # 创建OK按钮 $okButton = New-Object System.Windows.Forms.Button $okButton.Location = New-Object System.Drawing.Point(350,350) $okButton.Size = New-Object System.Drawing.Size(100,24) $okButton.Text = '确定' $okButton.Enabled = $false # 初始状态禁用 $form.AcceptButton = $okButton # 回车触发点击 $form.Controls.Add($okButton) # 创建提示标签 $label = New-Object System.Windows.Forms.Label $label.Location = New-Object System.Drawing.Point(270,300) $label.Size = New-Object System.Drawing.Size(280,20) $label.Text = '请扫描您的卡片:' $form.Controls.Add($label) # 创建输入框 $textBox = New-Object System.Windows.Forms.TextBox $textBox.Location = New-Object System.Drawing.Point(270,320) $textBox.Size = New-Object System.Drawing.Size(260,20) $form.Controls.Add($textBox) $form.Topmost = $true $form.Add_Shown({$textBox.Select()}) # 输入框内容变化事件:控制OK按钮启用状态 $textBox.Add_TextChanged({ $okButton.Enabled = -not [string]::IsNullOrWhiteSpace($textBox.Text) }) # OK按钮点击事件 $okButton.Add_Click({ $resetCardNumber = $textBox.Text.Trim() $targetUser = $Spreadsheet | Where-Object RFID -eq $resetCardNumber # 自定义弹出消息框 $msgForm = New-Object System.Windows.Forms.Form $msgForm.Size = New-Object System.Drawing.Size(400,200) $msgForm.StartPosition = 'CenterParent' $msgForm.BackColor = "#A4F9F4" # 可自定义样式 $msgForm.ForeColor = "#000000" $msgForm.FormBorderStyle = 'FixedDialog' $msgForm.MaximizeBox = $false $msgForm.MinimizeBox = $false $msgForm.Topmost = $true $msgForm.Text = "提示" $msgLabel = New-Object System.Windows.Forms.Label $msgLabel.Location = New-Object System.Drawing.Point(20,30) $msgLabel.Size = New-Object System.Drawing.Size(340,100) if($targetUser){ # 重置AD账户密码 Set-ADAccountPassword $targetUser.Username -Reset -NewPassword (Convertto-Securestring -AsPlainText $targetUser.Password -Force) $msgLabel.Text = "您的用户名:$($targetUser.Username) `n您的密码:$($targetUser.Password)" } else { $msgLabel.Text = "系统中未找到您的用户信息" } $msgForm.Controls.Add($msgLabel) # 15秒自动关闭定时器 $timer = New-Object System.Windows.Forms.Timer $timer.Interval = 15000 $timer.Add_Tick({ $timer.Stop() $msgForm.Close() }) $timer.Start() $msgForm.ShowDialog() $timer.Dispose() $msgForm.Dispose() # 重置输入框,恢复待扫描状态 $textBox.Clear() $textBox.Select() }) # 运行主表单 $form.ShowDialog() $form.Dispose()
补充说明
你可以根据需求自行修改自定义消息框的样式参数,包括大小、位置、背景色、字体、文字大小等,和主表单的样式配置逻辑完全一致。
内容的提问来源于stack exchange,提问作者Daniel De La Warr
相关产品推荐
相关产品推荐

