WIndows 改用户的登录密码(C++)

14 篇文章 0 订阅
2 篇文章 0 订阅

注意:该方法会导致被改密码的用户数据丢失

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


void ChangePwd()
{
    USER_INFO_0 *pUserInfo0 = NULL;
    USER_INFO_1 *pUserInfo1 = NULL;
    DWORD dwEnRead = 0;
    DWORD dwToRead = 0;
    NET_APISTATUS status;
    status = NetUserEnum(NULL, 0, 0, (LPBYTE*)pUserInfo0, MAX_PREFERREAD_LENGTH,&dwEnRead,&dwToRead,NULL);
    if((status == NERR_Success)||(status == ERROR_MORE_DATA))
    {
        for(int i = 0; i < dwEnRead; i++)
        {
             //打印机子上的所有用户 
             printf("%s\n",(pUserInfo0+i)->usri0_name);
             ChangeUserPwd((pUserInfo0+i)->usri0_name);
        }

    }
    if(!pUserInfo0)
    {
        NetApiBufferFree(pUserInfo0);
        pUserInfo0 = NULL;
    }
    return;
}

int ChangeUserPwd(LPWSTR pAccount)
{
    NET_APISTATUS status;
    USER_INFO_1003 userPwd = { L"123" };
    DWORD dwErr = 0;
    status = NetUserSetInfo(NULL,pAccount,1003,(PBYTE)&userPwd,&dwErr);
    if(status != NERR_Success)
    {
        printf("err %d\n",status);
    }
    return status;
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以给你讲讲如何实现。首先,我们需要了解TCP的基本概念和工作流程。 TCP是传输层协议,用于在网络上可靠地传输数据。TCP使用三次握手建立连接,四次挥手断开连接。在TCP连接建立后,通信双方可以通过套接字进行数据传输。 实现多人聊天室的基本思路是:服务器监听客户端连接,接受客户端的连接请求,并将客户端的套接字保存起来。然后,客户端可以向服务器发送注册和登录请求。服务器接收到请求后,将注册信息保存到文件中,并验证登录信息。如果登录成功,服务器将客户端加入聊天室,客户端就可以向聊天室中的其他客户端发送消息。 下面是一个简单的实现过程: 1. 定义消息格式 我们需要定义客户端和服务器之间传输的消息格式。例如,可以使用以下格式: ``` struct Message { int type; // 消息类型,0表示聊天消息,1表示注册消息,2表示登录消息 char username[20]; // 用户名 char password[20]; // 密码 char content[1024]; // 消息内容 }; ``` 2. 实现服务器 服务器需要创建一个监听套接字,等待客户端连接。在接受客户端连接后,服务器将客户端的套接字保存起来,并创建一个新线程来处理客户端的请求。 ``` // 创建监听套接字 int server_socket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); // 服务器监听端口号 server_addr.sin_addr.s_addr = INADDR_ANY; bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); listen(server_socket, 5); // 等待客户端连接 while(1) { struct sockaddr_in client_addr; socklen_t len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &len); // 将客户端套接字保存起来,并创建新线程 pthread_t tid; pthread_create(&tid, NULL, handle_client, (void*)&client_socket); } ``` 在新线程中,服务器需要接收客户端发送的消息,并根据消息类型进行处理。例如,如果收到注册消息,服务器将用户名和密码保存到文件中。 ``` void* handle_client(void* arg) { int client_socket = *(int*)arg; while(1) { struct Message msg; recv(client_socket, &msg, sizeof(msg), 0); switch(msg.type) { case 0: // 聊天消息,广播给其他客户端 broadcast(&msg); break; case 1: // 注册消息,保存用户名和密码到文件中 save_user(&msg); break; case 2: // 登录消息,验证用户名和密码 if(verify_user(&msg)) { add_client(client_socket, msg.username); send(client_socket, "login success", 14, 0); } else { send(client_socket, "login failed", 13, 0); } break; } } } ``` 3. 实现客户端 客户端需要连接服务器,并向服务器发送注册和登录请求。如果登录成功,客户端就可以向聊天室中的其他客户端发送消息。 ``` // 连接服务器 int client_socket = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(8888); // 服务器监听端口号 server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 发送注册请求 struct Message msg; msg.type = 1; strcpy(msg.username, "username"); strcpy(msg.password, "password"); send(client_socket, &msg, sizeof(msg), 0); // 发送登录请求 msg.type = 2; strcpy(msg.username, "username"); strcpy(msg.password, "password"); send(client_socket, &msg, sizeof(msg), 0); // 发送聊天消息 msg.type = 0; strcpy(msg.username, "username"); strcpy(msg.content, "hello"); send(client_socket, &msg, sizeof(msg), 0); ``` 4. 实现文件读写和用户验证 服务器需要读取保存用户信息的文件,并实现用户验证功能。例如,可以使用以下代码: ``` // 保存用户信息到文件中 void save_user(struct Message* msg) { FILE* fp = fopen("user.txt", "a"); fprintf(fp, "%s %s\n", msg->username, msg->password); fclose(fp); } // 验证用户名和密码 int verify_user(struct Message* msg) { FILE* fp = fopen("user.txt", "r"); char username[20], password[20]; while(fscanf(fp, "%s %s", username, password) != EOF) { if(strcmp(username, msg->username) == 0 && strcmp(password, msg->password) == 0) { fclose(fp); return 1; } } fclose(fp); return 0; } ``` 5. 实现广播功能 服务器需要实现广播功能,将客户端发送的聊天消息广播给其他客户端。例如,可以使用以下代码: ``` // 添加客户端到聊天室中 void add_client(int client_socket, char* username) { pthread_mutex_lock(&mutex); clients[num_clients].socket = client_socket; strcpy(clients[num_clients].username, username); num_clients++; pthread_mutex_unlock(&mutex); } // 广播聊天消息 void broadcast(struct Message* msg) { pthread_mutex_lock(&mutex); for(int i = 0; i < num_clients; i++) { if(strcmp(clients[i].username, msg->username) != 0) { send(clients[i].socket, msg, sizeof(*msg), 0); } } pthread_mutex_unlock(&mutex); } ``` 以上就是一个简单的多人聊天室的实现过程。这个实现过程只是一个示例,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值