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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:51:10