Windows NetUSerSetInfo未设置UF\u密码\u已过期

Windows NetUSerSetInfo未设置UF\u密码\u已过期,windows,Windows,我正在尝试编写一个应用程序,该应用程序将强制用户在下次登录时更改其密码。因此,我尝试在标志UF_PASSWORD_EXPIRED(对于1001和1008)和当前历元(对于1017)上使用结构为1001、1008或1017的NetUserSetInfo。我还尝试将1008和1017组合起来。知道我已经从管理员帐户测试了我的应用程序 我还试着用计算机名NULL、“.”和“MyComputer”调用NetUserSetInfo(我发现一篇帖子说它可以使用)。如果为NULL,则返回错误代码为0。使用“.

我正在尝试编写一个应用程序,该应用程序将强制用户在下次登录时更改其密码。因此,我尝试在标志UF_PASSWORD_EXPIRED(对于1001和1008)和当前历元(对于1017)上使用结构为1001、1008或1017的NetUserSetInfo。我还尝试将1008和1017组合起来。知道我已经从管理员帐户测试了我的应用程序

我还试着用计算机名NULL、“.”和“MyComputer”调用NetUserSetInfo(我发现一篇帖子说它可以使用)。如果为NULL,则返回错误代码为0。使用“.”表示错误信息待定,使用“MyComputer”表示“无效名称”

但是所有的实验都给出了相同的结果。即,未设置该标志

我发现一篇帖子说UF_PASSWORD_EXPIRED标志只适用于XP。但它不符合Windows文档。如果我在控制面板中选中“用户下次登录时必须更改密码”,则会设置此标志

那么,如何以编程方式设置此标志呢


感谢

不幸的是,网络管理API的文档并不总是清楚地说明任何特定标志的状态是否可以更改或是只读的,但我已经做了一些测试,看起来
UF\u PASSWORD\u EXPIRED
标志是只读标志之一

强制密码重置的正确方法是使用
usri4\u password\u expired

调用NetUserAdd或NetUserSetInfo时,请在此成员中指定一个非零值,以通知用户下次登录时必须更改密码

这对我很有用:

#include <Windows.h>
#include <LM.h>

#pragma comment(lib, "netapi32.lib")

#include <stdio.h>

int wmain(int argc, wchar_t ** argv)
{
    // argv[1] must contain the username

    DWORD err;
    USER_INFO_4 *ui4;

    err = NetUserGetInfo(NULL, argv[1], 4, (LPBYTE*)(&ui4));
    if (err != 0)
    {
        printf("NetUserGetInfo: %u\n", err);
        return 1;
    }

    ui4->usri4_password_expired = 1;

    err = NetUserSetInfo(NULL, argv[1], 4, (LPBYTE)ui4, NULL);
    if (err != 0)
    {
        printf("NetUserSetInfo: %u\n", err);
        return 1;
    }

    NetApiBufferFree(ui4);

    printf("OK\n");
    return 0;
}
#包括
#包括
#pragma注释(lib,“netapi32.lib”)
#包括
内部wmain(内部argc,wchar\u t**argv)
{
//argv[1]必须包含用户名
德沃德·厄尔;
用户信息4*ui4;
err=NetUserGetInfo(NULL,argv[1],4,(LPBYTE*)(&ui4));
如果(错误!=0)
{
printf(“NetUserGetInfo:%u\n”,错误);
返回1;
}
ui4->usri4\u密码\u过期=1;
err=NetUserSetInfo(NULL,argv[1],4,(LPBYTE)ui4,NULL);
如果(错误!=0)
{
printf(“NetUserSetInfo:%u\n”,错误);
返回1;
}
NetApiBufferFree(ui4);
printf(“OK\n”);
返回0;
}

不幸的是,网络管理API的文档并不总是明确说明任何特定标志的状态是否可以更改或是只读的,但我已经做了一些测试,看起来
UF\u PASSWORD\u EXPIRED
标志是只读标志之一

强制密码重置的正确方法是使用
usri4\u password\u expired

调用NetUserAdd或NetUserSetInfo时,请在此成员中指定一个非零值,以通知用户下次登录时必须更改密码

这对我很有用:

#include <Windows.h>
#include <LM.h>

#pragma comment(lib, "netapi32.lib")

#include <stdio.h>

int wmain(int argc, wchar_t ** argv)
{
    // argv[1] must contain the username

    DWORD err;
    USER_INFO_4 *ui4;

    err = NetUserGetInfo(NULL, argv[1], 4, (LPBYTE*)(&ui4));
    if (err != 0)
    {
        printf("NetUserGetInfo: %u\n", err);
        return 1;
    }

    ui4->usri4_password_expired = 1;

    err = NetUserSetInfo(NULL, argv[1], 4, (LPBYTE)ui4, NULL);
    if (err != 0)
    {
        printf("NetUserSetInfo: %u\n", err);
        return 1;
    }

    NetApiBufferFree(ui4);

    printf("OK\n");
    return 0;
}
#包括
#包括
#pragma注释(lib,“netapi32.lib”)
#包括
内部wmain(内部argc,wchar\u t**argv)
{
//argv[1]必须包含用户名
德沃德·厄尔;
用户信息4*ui4;
err=NetUserGetInfo(NULL,argv[1],4,(LPBYTE*)(&ui4));
如果(错误!=0)
{
printf(“NetUserGetInfo:%u\n”,错误);
返回1;
}
ui4->usri4\u密码\u过期=1;
err=NetUserSetInfo(NULL,argv[1],4,(LPBYTE)ui4,NULL);
如果(错误!=0)
{
printf(“NetUserSetInfo:%u\n”,错误);
返回1;
}
NetApiBufferFree(ui4);
printf(“OK\n”);
返回0;
}

是!它起作用了!谢谢。我还有一个问题。但这可能是我之前尝试的副作用。同样的数据在numerus结构中重复也是一个问题。你永远不知道哪一个会产生预期的效果。你不能全部测试,是的!它起作用了!谢谢。我还有一个问题。但这可能是我之前尝试的副作用。同样的数据在numerus结构中重复也是一个问题。你永远不知道哪一个会产生预期的效果。你不能测试所有的。