想要获取到windows密码到期时间。大家认为windows下有现成的api吗,我也认为有。
我使用了USER_INFO_3 的结构体,其中有一项usri3_password_expried,该解释如下(密码到期信息);但是,不论我怎么修改密码策略,获取到的值永远是0(0表示永不过期)
在此,花费了很长时间来寻找有关密码到期的WIN API。并无所获。
我甚至认为,密码到期时间获取不出来,但是既然获取不出来,那windows操作系统为什么到了自己设定的时间就会弹出来您的密码即将到期或者,显示密码已到期的提示呢。所以这个信息肯定是存在的,肯定是能获取出来的。只是我不能继续找WIN API 来获取。
正文:
换种思路来,cmd中输入命令“net user administrator”可以查看administrator用户的信息,包括密码到期的日期。
因此在程序中注入dos命令“net user XXX”来得到一大堆信息,从中分析出密码到期的日期。如下
int ExeCmd(char* result)
{
char buffer[1280];
int n = 0;
FILE* pipe = _popen("net user administrator", "r");
if (!pipe)
{
return 0;
}
while( !feof(pipe) )
{
if( fgets(buffer, 1280, pipe) )
{
n++;
if(n == 10)//因为密码到期那天信息,在整个一堆信息的第十行,只用获取到第十行信息即可
{
strcat(result,buffer);//密码信息存在result
return 1;
}
}
}
_pclose(pipe);
return 1;
}
拿到日期后就好说了,拿到的是字符串的日期信息,我的做法是将年份,月份,以及哪一天,转换成int。再写一个算法即可求出今日至密码到期的日期,还剩几天。如下程序,DayNum为最终结果(密码倒计时天数)。
//iYear,iMon,iDay是密码到期日期 m_year,m_mon,m_day是今天的日期
int data[11] = { 31,28,31,30,31,30,31,31,30,31,30 };
yearcount = (iYear - m_year - 1) * 365 + CountYear(m_year,iYear);
if ((iYear % 400 == 0) || (iYear % 4 == 0 && iYear % 100 != 0) && iMon > 2)
yearcount++;
for (int i = 0; i < iMon-1; i++)
{
monthcount += data[i];
}
DayNum = yearcount + monthcount + iDay + EndYear(m_year,m_month,m_day);//DayNum为天数
/**********************************需要用到以下函数**********************************/
//处理倒计时天数算法
int CountYear(int m_year,int iYear)
{
int tmp = 0;
for (int i = m_year; i < iYear; i++)
{
if ((i % 400 == 0) || (i % 4 == 0 && i % 100 != 0))
tmp++;
}
return tmp;
}
int EndYear(int year,int month,int day)//密码到期日期解析出来的年月日
{
int PData[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int RData[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
int num = 0;
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0) )//闰年
{
num = RData[month] - day;
for ( int i = month + 1; i <= 12; i++)
{
num += RData[i];
}
}
else
{
num = PData[month] - day;
for ( int i = month + 1; i <= 12; i++)
{
num += PData[i];
}
}
return num;
}