LogonUser[advapi32.dll] 验证当前账户是否有密码

Code

#include <windows.h>
#include <Ntsecapi.h>
#include <stdio.h>

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

int
main()
{
       WCHAR UserName[256] = {0};
       ULONG UserNameLength = 256;
       BOOL bRet = FALSE;
       NTSTATUS status = 0;
       ULONG SessionCount = 0;
       PLUID SessionList = NULL;
       PSECURITY_LOGON_SESSION_DATA SessionData = NULL;
       DWORD ErrorCode = 0;

       bRet = GetUserNameW(UserName, &UserNameLength);
       if (bRet == FALSE)
       {
              ErrorCode = GetLastError();
              return bRet;
       }

       status = LsaEnumerateLogonSessions(&SessionCount, &SessionList);
       if (status != 0)
       {
              return bRet;
       }

       for (ULONG Index = 0; Index < SessionCount; Index++, SessionList++)
       {
              status = LsaGetLogonSessionData(SessionList, &SessionData);
              if (status != 0)
              {
                     continue;
              }

              if (SessionData->UserName.Length &&
                     !_wcsnicmp(UserName, SessionData->UserName.Buffer, UserNameLength))
              {
                     HANDLE UserToken = NULL;

                     bRet = LogonUserW(UserName, SessionData->LogonDomain.Buffer, NULL, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, &UserToken);
                     if (bRet == TRUE)
                     {
                           CloseHandle(UserToken);
                     }else if (GetLastError() == ERROR_ACCOUNT_RESTRICTION)
                     {
                           bRet = TRUE;
                     }
              }

              LsaFreeReturnBuffer(SessionData);
       }

       LsaFreeReturnBuffer(SessionList);

       getchar();
       return bRet;
}
1.LsaGetLogonSessionData()
  • Win7下,此段程序可以获取所有的SessionData
  • Win10下,只能获取当前SessionData
  • 以上结论错误,和系统版本无关,是因为UAC,能获取所有SessionData说明使用管理员权限启动进程,完整性标签为High;正常权限启动,完整性标签为Medium,拿不到其他SessionData信息返回拒绝访问。
2. LogonUser()
  • Win7下,可以使用LOGON32_LOGON_NETWORK,进行空密码的试探登陆,类似于ipc$连接,如果密码确实为空则登陆成功
  • Win10下,使用LOGON32_LOGON_NETWORK则依然会报ERROR_ACCOUNT_RESTRICTION错误,和使用高权限登陆(LOGON32_LOGON_INTERACTIV)进行空密码登陆一样的错误
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 Python 的 pywin32 库来实现这个目的。 下面是一个示例代码: ``` import win32security import pywintypes # 定义要使用的用户名和密码 username = 'username' password = 'password' # 使用用户名和密码创建一个凭证 creds = win32security.Credential(Username=username, Password=password) # 使用凭证登录 try: win32security.LogonUser(creds) except pywintypes.error as e: # 如果登录失败,则输出错误信息 print(e) ``` 在这段代码中,我们首先定义了要使用的用户名和密码。然后,使用这些信息创建了一个凭证。最后,我们使用这个凭证登录 Windows 系统。如果登录失败,则会捕获异常并输出错误信息。 注意,这段代码需要 pywin32 库的支持。你可以使用 `pip install pywin32` 命令安装这个库。 ### 回答2: 要实现Windows系统安全软件需要输入密码,可以使用Python编写以下代码: ```python import getpass def windows_security(): password = "123456" # 设置密码 input_password = getpass.getpass("请输入密码:") if input_password == password: print("密码正确,可以进入系统。") # 在此处添加执行系统安全软件的代码 else: print("密码错误,无法进入系统。") windows_security() ``` 上述代码使用了`getpass`模块中的`getpass`函数,该函数会在命令行中接收用户的输入,但不会将输入结果显示出来,以保证密码的安全性。在代码中,我们设置了密码为"123456",用户需要在命令行中输入密码,输入的密码会与设置的密码进行比对。如果输入的密码正确,程序会提示"密码正确,可以进入系统。",并可以继续编写执行系统安全软件的相关代码;如果输入的密码错误,程序会提示"密码错误,无法进入系统。"。 请注意,这只是一个简单的密码验证示例,实际的系统安全软件可能需要更复杂的密码验证机制,以提高系统的安全性。 ### 回答3: 要实现在Python代码中输入密码的功能,可以使用getpass模块。getpass模块提供了一个可以安全输入密码的函数,可以在控制台中隐藏密码的输入。 首先,我们需要导入getpass模块。然后,可以使用getpass函数来获取用户输入的密码,如下所示: ```python import getpass password = getpass.getpass('请输入密码:') ``` 在上述代码中,调用getpass.getpass函数时,会显示一个提示信息'请输入密码:',然后等待用户在控制台中输入密码。用户输入的密码将会被隐藏,不会显示在控制台中。 可以将这段代码作为登录系统时用户输入密码的部分,在后续代码中可根据实际需要对密码进行验证或使用。 需要注意的是,getpass模块是在命令行中隐藏密码输入的,而不是直接在Windows系统上实现安全软件。要实现Windows系统上的安全软件,需要更多的代码逻辑和功能,例如加密/解密、防火墙、扫描恶意软件等。本文只提供了一个用户输入密码的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值