C++ 读取组策略中的密码策略
来源:互联网 发布:三国杀风火山林淘宝 编辑:程序博客网 时间:2024/05/15 01:12
获取组策略中的密码策略只用到了一个api函数 NetUserModalsGet, 具体用法去查MSDN。单靠这一个函数获取的内容还不全面,密码复杂性是否启用不能获取到,还需要再读一下注册表。读取HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account 键下的“F”键值--一段二进制数据,其中的第80(0开始)个字节为密码长度, 第76个字节为密码复杂性检查是否启用的标记。1代表启用,0代表未启用。 编译时选择uincode。
#include "stdafx.h"#include <stdio.h>#include <windows.h> #include <lm.h>#include <Aclapi.h>#pragma comment(lib,"Advapi32")#pragma comment(lib, "Netapi32.lib")typedef struct {int Complex; //密码复杂性是否已启用int Len; //密码最小长度}PwdComplex;bool ModifyRegCompetence(LPSTR Group, LPSTR key);bool GetPwdComplex(PwdComplex* pCom);int wmain(int argc, wchar_t *argv[]){DWORD dwLevel = 0;USER_MODALS_INFO_0 *pBuf = NULL;NET_API_STATUS nStatus;LPTSTR pszServerName = NULL;if (argc > 2){fwprintf(stderr, L"Usage: %s [\\\\ServerName]\n", argv[0]);exit(1);}if (argc == 2)pszServerName = argv[1];nStatus = NetUserModalsGet(pszServerName,dwLevel,(LPBYTE *)&pBuf);if (nStatus == NERR_Success){if (pBuf != NULL){printf("\tMinimum password length: %d\n", pBuf->usrmod0_min_passwd_len);printf("\tMaximum password age (d): %d\n", pBuf->usrmod0_max_passwd_age/86400);printf("\tMinimum password age (d): %d\n", pBuf->usrmod0_min_passwd_age/86400);printf("\tForced log off time (s): %d\n", pBuf->usrmod0_force_logoff);printf("\tPassword history length: %d\n", pBuf->usrmod0_password_hist_len);}}elsefprintf(stderr, "A system error has occurred: %d\n", nStatus);if (pBuf != NULL)NetApiBufferFree(pBuf);//修改权限对Administrators开放bool bModify = ModifyRegCompetence("Administrators", "MACHINE\\SAM\\SAM");PwdComplex complex;if(GetPwdComplex(&complex)){printf("\tPassword Complexity : %s\n", (complex.Complex ? "密码复杂性已使用":"密码复杂性已禁用"));printf("\tPassword len : %d\n", complex.Len);}return 0;}bool ModifyRegCompetence(LPSTR Group, LPSTR key){PACL pOldDacl=NULL;PACL pNewDacl=NULL;DWORD dRet;EXPLICIT_ACCESS_A eia;PSECURITY_DESCRIPTOR pSID=NULL;dRet = GetNamedSecurityInfoA(key,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSID);// 获取SAM主键的DACL if(dRet != ERROR_SUCCESS)goto END;//创建一个ACE,允许Administrators组成员完全控制对象,并允许子对象继承此权限ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS_A));BuildExplicitAccessWithNameA(&eia,Group, KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT);// 将新的ACE加入DACL dRet = SetEntriesInAclA(1,&eia,pOldDacl,&pNewDacl);if(dRet != ERROR_SUCCESS)goto END;// 更新SAM主键的DACL dRet = SetNamedSecurityInfoA(key,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);if(dRet != ERROR_SUCCESS)goto END;END: //释放DACL和SIDif(pNewDacl)LocalFree(pNewDacl);if(pSID)LocalFree(pSID);return 1;}bool GetPwdComplex(PwdComplex* pCom){HKEY hKey;long lResult;char buf[MAX_PATH] = {0};DWORD len = MAX_PATH;lResult = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SAM\\SAM\\Domains\\Account"),0, KEY_READ, &hKey);if(lResult != ERROR_SUCCESS)return 0;lResult = ::RegQueryValueEx(hKey, _T("F"), NULL, NULL, (LPBYTE)buf, &len);if(lResult != ERROR_SUCCESS)return 0;RegCloseKey(hKey);pCom->Complex =(int)buf[76];pCom->Len = (int)buf[80];return 1;}
- C++ 读取组策略中的密码策略
- 组策略 允许空密码
- C#.NET中的同步策略
- 组策略中的软件限制策略
- 取消域的组策略密码
- 个人密码管理策略
- 强制实施密码策略
- RedHat linux 密码策略
- 密码加固策略
- 修改域密码策略
- AIX 密码策略
- MYSQL57密码策略修改
- mysql 5.7密码策略
- mysql密码策略
- 修复WINDOWS中的组策略
- 关于域完全策略的密码策略
- 策略
- 策略
- mysql内存原理与数据结构介绍
- Django REST/ Django RESTful
- jquery控制css绝对定位位置效果,例如鼠标移动到图标显示层显示相关信息
- Apache commons (Java常用工具包)简介
- 回溯法简介
- C++ 读取组策略中的密码策略
- 回溯法:输出n的全排列,解哈密顿问题,马的遍历问题,解八后问题
- sizeof详解
- N9 安装Qt5
- Ubuntu下Jenkins 安装
- Huffman编码树
- java位运算
- Android4.0 设置系统默认输入法
- 在虚拟机vmware8.0上安装mac os lion 10.7和xcode4.1