企业级 Active Directory 账户管理平台,支持用户自助改密、管理员批量操作、入职流程、可视化仪表盘。
- .NET 8 + ASP.NET Core Razor Pages + Bootstrap 3
- System.DirectoryServices.AccountManagement(AD 操作)
- Windows Server + IIS 部署,Kestrel 开发调试
- NetUserSetInfo API 触发 PCNSSVC 多域密码同步
- AES-256 加密保护敏感日志文件
不需要部署在 AD 域控服务器上,只要部署在已加入域的任意 Windows Server 或 Windows 电脑即可。
域控发现机制:代码中使用 new PrincipalContext(ContextType.Domain) 不加任何 IP 地址,系统通过 DNS SRV 记录自动发现域控:
- 查询
_ldap._tcp.garchina.com获取域内所有 DC 列表 - 优先选择同一 Active Directory 站点(子网)的 DC
- 自动故障转移:当前 DC 不可用时切换下一个
所有操作走 Windows 集成身份验证(应用池标识),域控升级或 IP 变更无需改代码。
- 域密码修改(当前密码验证 → 强度校验 9位+大小写+数字+符号+无连续 → 邮件通知用户)
- 入职申请提交(多字段表单 + 自动邮件通知管理员)
- 模糊搜索:按员工号/姓名/UPN 关键字搜索,支持数字和字母混合查询
- 用户详情:显示名、员工号、UPN、邮箱、电话、启用/锁定状态、密码到期时间、所属组
- 密码重置(随机生成 12 位 + PCNS 同步 + 邮件通知)
- 一键离职(禁用账号 + 修改 UPN/邮箱 + 自动附加日期描述)
- 批量解锁所有锁定账号
- 加用户组(弹窗输入组名,自动添加)
- 管理员授权管理(超级管理员保护,前端不显示删除按钮)
- 多行输入(支持换行/逗号/空格分隔)
- 四个操作按钮:查询 / 启用 / 禁用 / 批量重置密码
- 批量重置密码:生成随机密码 + PCNS 同步 + 整合为一封邮件通知
- 结果面板复制按钮,方便记录归档
- 二次确认弹窗防误操作
- 多行输入批量操作
- 更新邮箱地址:将 mail 属性后缀统一替换为
@golden-agri.com(空的跳过、已是目标后缀的跳过) - 维护用户组:一键批量加入 FOOD / GAR / TPM / SAP 用户组(已在组中的自动跳过)
- 填写表单 → 写入 AD → 异步发送邮件
- 自动生成 12 位密码(排除易混淆字符 1/l/L/o/0/O)
- 创建记录和邮件状态持久化
- 员工提交入职申请 → 管理员审批
- 审批通过自动创建 AD 账号 + 发送通知
- 支持编辑申请信息后再创建
- 回传邮箱通知用户账号已创建
- 申请编号格式 YYYYMMDD-员工号
- 用户总数/启用/禁用/锁定/待处理 实时卡片(点击下钻跳转)
- OU 用户分布进度条
- 7 日密码更新趋势
- 最近 30 日入职统计
- 今日操作 + 密码到期预警(点击直接查询)
- 运营数据(30 天密码重置/自助修改次数)
- 按 OU 查询用户列表(动态列宽对齐)
- 密码到期查询(7/30/60 天)
- 最近 7 天更新密码用户
- CSV 导出
- 统计图表(条形图 + 占比百分比)
- 12 小时服务器缓存,极速查询
- 统一日志面板,200 条/页分页
- 合并显示所有操作(登录、密码操作、创建用户、离职、解锁)+ 邮件发送状态
- 页面底部显示日志文件路径
- Session 认证 + 管理员白名单(JSON 文件管理)
- 未登录自动跳转登录页,登录后返回原页面
- 所有 App_Data 文件 AES-256 加密存储(.dat 扩展名)
- 审计日志(密码变更、离职、解锁、登录等全记录,永不清除)
- 敏感操作二次确认(Bootstrap 模态框)
cd D:\VScode\AccountManagement
dotnet run双击 AccountManagement.exe 自动打开浏览器访问 http://localhost:5000。
AccountManagement.exe 是 dotnet publish 命令编译生成的框架依赖型可执行文件,它本身不包含 .NET 运行时和业务代码,而是作为一个原生启动器(AppHost),作用如下:
- 定位运行时:exe 内嵌了目标框架标识(
net8.0),启动时在系统中查找已安装的 .NET 8 运行时。如果未安装会报错提示安装 Hosting Bundle - 加载 DLL:找到运行时后,加载同目录下的
AccountManagement.dll——这才是真正包含所有编译后业务逻辑的程序集(Razor 页面、后端代码、Helper 等全部编译在里面) - 读取运行配置:根据同目录的
AccountManagement.runtimeconfig.json确定框架版本、GC 模式等参数,然后启动 ASP.NET Core 的 Kestrel HTTP 服务器 - IIS 集成:当通过 IIS 托管时,
web.config中的AspNetCoreModuleV2负责启动该 exe 并将 HTTP 请求转发给它(in-process 模式下直接在 IIS 工作进程内加载 DLL,不走 exe)
为什么 exe 只有 150KB 而 DLL 有 400KB:exe 只是一个薄壳启动器,所有 Razor 页面、C# 业务逻辑、第三方依赖都编译进了 DLL。部署时 exe + DLL 必须一起存在,缺一不可。
如何重新生成:
# 框架依赖型(默认,需要服务器预装 .NET 8,体积小 ~3MB)
dotnet publish -c Release -o ./publish
# 独立部署型(内置运行时,无需预装 .NET,体积大 ~80MB)
dotnet publish -c Release --self-contained -r win-x64 -o ./publish-standalone当前项目使用框架依赖型,部署前确认服务器已安装 .NET 8 Hosting Bundle。
- 服务器安装 .NET 8 Hosting Bundle 和 IIS
- 将
bin/Publish/目录复制到服务器(如D:\WebApps\AccountManagement\) - IIS 中创建独立的应用程序池(名称如
AccountManagement),避免与其他站点冲突 - 应用程序池设置:
- .NET CLR 版本:"无托管代码"
- 标识:设为有 AD 权限的域账号,推荐使用 NetworkService(以计算机账号
DOMAIN\SERVERNAME$访问 AD)
- IIS 创建站点/应用程序,指向部署目录,绑定到新建的应用池
- 部署时保留
App_Data/文件夹不动,避免日志丢失 - 替换 DLL 后务必执行
iisreset或回收应用池
├── Helpers/
│ ├── PasswordHelper.cs # NetUserSetInfo P/Invoke 触发 PCNS
│ └── FileProtection.cs # AES 加密文件读写
├── Models/
│ └── OnboardRequest.cs # 入职申请数据模型
├── Pages/
│ ├── Index.cshtml # 用户自助改密主页
│ ├── Onboard.cshtml # 入职申请页面
│ └── Admin/
│ ├── Login.cshtml # 管理员登录
│ ├── UserAdmin.cshtml # 账号查询管理(模糊搜索 + 控制面板)
│ ├── Dashboard.cshtml # 系统仪表盘(可视化 + 下钻)
│ ├── Report.cshtml # 用户统计报表(缓存 + CSV 导出)
│ ├── Request.cshtml # 待创建用户(入职流程)
│ ├── NewUser.cshtml # 手动创建用户
│ ├── BatchUser.cshtml # 批量用户管理
│ ├── EditUser.cshtml # 编辑用户信息(邮箱更新+用户组维护)
│ ├── AdminLog.cshtml # 高级日志查询(加密存储 + 分页)
│ └── SinarmasUser.cshtml # 跨域用户查询
├── Pages/Shared/
│ ├── _Layout.cshtml # 公共布局(页脚)
│ └── _AdminLayout.cshtml # 管理后台布局(侧边栏 + 导航)
├── wwwroot/ # 静态资源 (css/js/lib/logo)
├── appsettings.json # 配置文件 (SMTP/OU/PathBase)
└── Program.cs # 应用入口 (自动打开浏览器)