Delphi创建Windows用户时设置账号过期时间失效问题求助
解决Delphi设置Windows用户账号过期日期的问题
嗨,我之前也踩过这个坑!你用DateTimeToUnix()给usri2_acct_expires赋值的思路不对——Windows账号的过期时间字段需要的是FILETIME格式的64位数值,而不是Unix时间戳(Unix时间是从1970年1月1日开始计数的秒数,和FILETIME的基准、单位完全不同),这就是为什么你的设置会变成“从不”的原因。
下面给你具体的解决步骤和代码:
核心原理
usri2_acct_expires属于USER_INFO_2结构体,它接收的是FILETIME对应的64位整数——这个数值是以1601年1月1日为起点,以100纳秒为间隔的计数。我们需要把Delphi的TDateTime转换成这个格式的数值。
具体实现代码
首先添加必要的单元引用:Windows和SysUtils,然后写一个转换函数把TDateTime转成FILETIME:
function DateTimeToFileTime(ADateTime: TDateTime): FILETIME; var SystemTime: TSystemTime; begin DateTimeToSystemTime(ADateTime, SystemTime); if not SystemTimeToFileTime(SystemTime, Result) then FillChar(Result, SizeOf(Result), 0); end;
接下来在设置用户过期日期的时候,这样处理:
var ftExpiry: FILETIME; ulExpiry: ULARGE_INTEGER; targetDate: TDateTime; begin targetDate := DateTimePicker1.Date; // 把选择的日期转成FILETIME ftExpiry := DateTimeToFileTime(targetDate); // 将FILETIME拆分成高低位,转成64位整数 ulExpiry.LowPart := ftExpiry.dwLowDateTime; ulExpiry.HighPart := ftExpiry.dwHighDateTime; // 赋值给usri2_acct_expires usri2_acct_expires := ulExpiry.QuadPart; // 之后调用NetUserAdd或NetUserSetInfo来应用设置即可 end;
额外注意事项
- 如果要设置账号从不过期,直接把
usri2_acct_expires设为$7FFFFFFFFFFFFFFF(这是FILETIME能表示的最大日期,对应30828年12月31日)或者0即可。 - 你的程序必须以管理员权限运行,否则无法修改用户账号的属性。
- 确保你调用
NetUserAdd或NetUserSetInfo时,使用的是USER_INFO_2这个信息级别,不然usri2_acct_expires字段不会被识别。
内容的提问来源于stack exchange,提问作者Rober.Ya
相关产品推荐
相关产品推荐

