Windows系统开机参数设置(VC DLL)

转自:http://blog.csdn.net/jhqin/article/details/5880793

开发语言:VC

支持平台:Windows XP/Vista/Win7

版本历史:

V1.1 2010年09月19日

  • 增加函数AccountIsEmptyPassword,用于判断用户密码是否为空。

V1.0 2010年09月13日

  • 完成正式版本。

功能描述:

  • 获取本地时区显示名
  • 获取系统时区(已排序集合)
  • 判断时区是否实行夏令时
  • 设置本地时区
  • 更改计算机名和计算机描述
  • 增加用户帐户
  • 禁用用户帐户
  • 用户密码是否为空
  • 校验计算机名
  • 校验用户帐户名
  • 重启电脑

接口函数:

  • GetLocalTimeZoneDisplayName
  • GetSystemTimeZones
  • TimeZoneIsDaylightSavingTime
  • SetLocalTimeZoneByKeyName
  • SetComputerNameAndDescription
  • AddUserAccount
  • DisableUserAccount
  • AccountIsEmptyPassword
  • ValidateComputerName
  • ValidateUserAccount
  • GetMaxComputerNameLength
  • GetMaxUserAccountLength
  • GetMaxPasswordLength
  • GetMaxCommentLength
  • RebootComputer

下载地址:

 SetX.zip


源代码:

SetX.h

  1. /* ---------------------------------------------------------- 
  2. 文件名称:SetX.h 
  3.  
  4. 作者:秦建辉 
  5.  
  6. MSN:splashcn@msn.com 
  7.  
  8. 版本历史: 
  9.     V1.1    2010年09月19日 
  10.             增加函数AccountIsEmptyPassword,用于判断用户密码是否为空 
  11.  
  12.     V1.0    2010年09月13日 
  13.             完成正式版本。 
  14.  
  15. 功能描述: 
  16.     获取本地时区显示名 
  17.     获取系统时区(已排序集合) 
  18.     判断时区是否实行夏令时 
  19.     设置本地时区 
  20.     更改计算机名和计算机描述 
  21.     增加用户帐户 
  22.     禁用用户帐户 
  23.     用户密码是否为空 
  24.     校验计算机名 
  25.     校验用户帐户名 
  26.     重启电脑 
  27.  
  28. 接口函数: 
  29.     GetLocalTimeZoneDisplayName 
  30.     GetSystemTimeZones 
  31.     TimeZoneIsDaylightSavingTime 
  32.     SetLocalTimeZoneByKeyName 
  33.     SetComputerNameAndDescription 
  34.     AddUserAccount 
  35.     DisableUserAccount 
  36.     AccountIsEmptyPassword 
  37.     ValidateComputerName 
  38.     ValidateUserAccount 
  39.     GetMaxComputerNameLength 
  40.     GetMaxUserAccountLength 
  41.     GetMaxPasswordLength 
  42.     GetMaxCommentLength 
  43.     RebootComputer 
  44.  ------------------------------------------------------------ */  
  45. #pragma once   
  46.   
  47. #include <windows.h>   
  48. #include <tchar.h>   
  49. #include <LM.h>   
  50. #include <map>   
  51.   
  52. using namespace std;  
  53.   
  54. // 时区显示名类型定义   
  55. typedef struct _TimeZoneDisplayName  
  56. {  
  57.     TCHAR Name[128];  
  58.   
  59.     // 重载小于关系符,使显示名按汉字拼音排序   
  60.     BOOL operator <(const _TimeZoneDisplayName &A) const  
  61.     {  
  62.         // 提取时差   
  63.         TCHAR *s1;  
  64.         TCHAR *s2;  
  65.         LONG h1, h2, m1, m2;  
  66.   
  67.         // 从显示名中提取小时数   
  68.         h1 = _tcstol(Name + 4, &s1, 10);  
  69.         h2 = _tcstol(A.Name + 4, &s2, 10);  
  70.         if (h1 < h2) return TRUE; else if (h1 > h2) return FALSE;  
  71.   
  72.         // 从显示名中提取分钟数   
  73.         if(*s1 == TEXT(':'))  
  74.             m1 = _tcstol(s1 + 1, NULL, 10);  
  75.         else  
  76.             m1 = 0;       
  77.   
  78.         if(*s2 == TEXT(':'))  
  79.             m2 = _tcstol(s2 + 1, NULL, 10);  
  80.         else  
  81.             m2 = 0;  
  82.   
  83.         if (h1 < 0)  
  84.         {   // 负时区   
  85.             if (m1 > m2)return TRUE; else if (m1 < m2)return FALSE;  
  86.         }  
  87.         else  
  88.         {   // 正时区   
  89.             if (m1 < m2)return TRUE; else if (m1 > m2)return FALSE;  
  90.         }     
  91.   
  92.         // 同一时区,则按汉字拼音排序   
  93.         return (_tcscoll(Name, A.Name) < 0);   
  94.     }  
  95. } TimeZoneDisplayName;  
  96.   
  97. // 时区标识符类型定义   
  98. typedef struct _TimeZoneKeyName  
  99. {  
  100.     TCHAR Name[128];  
  101. } TimeZoneKeyName;  
  102.   
  103. #ifdef __cplusplus   
  104. extern "C"  
  105. {  
  106. #endif   
  107.   
  108. /* 
  109. 功能:获取本地时区显示名及当前是否是夏令时 
  110. 参数说明: 
  111.     pDisplayName:输出,存储时区显示名 
  112.     isDaylightSavingTime:输出,是否夏时制 
  113. 返回值: 
  114.     成功: 
  115.         TIME_ZONE_ID_UNKNOWN 
  116.         TIME_ZONE_ID_STANDARD 
  117.         TIME_ZONE_ID_DAYLIGHT 
  118.     失败: 
  119.         TIME_ZONE_ID_INVALID 
  120. */  
  121. DWORD WINAPI GetLocalTimeZoneDisplayName(TimeZoneDisplayName *pDisplayName, BOOL &isDaylightSavingTime);  
  122.   
  123. /* 
  124. 功能:返回时区信息在本地系统上可用的所有时区的已排序集合 
  125. 参数说明: 
  126.     pMapTimeZones:map对象指针,键值为时区显示名,值为时区标识符。 
  127. 返回值: 
  128.     TRUE:成功 
  129.     FALSE:失败 
  130. */  
  131. BOOL WINAPI GetSystemTimeZones(map<TimeZoneDisplayName, TimeZoneKeyName>* pMapTimeZones);  
  132.   
  133. /* 
  134. 功能:判断时区是否实行夏令时 
  135. 参数说明: 
  136.     szTimeZoneKeyName:时区标识符 
  137. 返回值: 
  138.     TRUE:该时区实行夏令时 
  139.     FALSE:该时区未实行夏令时 
  140. */  
  141. BOOL WINAPI TimeZoneIsDaylightSavingTime(const TCHAR* szTimeZoneKeyName);  
  142.   
  143. /* 
  144. 功能:根据时区标识符设置本地时区 
  145. 参数说明: 
  146.     szTimeZoneKeyName:时区标识符 
  147.     isDaylightSavingTime:是否夏时制 
  148. 返回值: 
  149.     TRUE:成功 
  150.     FALSE:失败 
  151. */  
  152. BOOL WINAPI SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime);  
  153.   
  154. /* 
  155. 功能:设置计算机名及计算机描述 
  156. 参数说明: 
  157.     szComputerName:要设置的计算机名,可以为NULL。 
  158.     szDescription:要设置的计算机描述,可以为NULL。 
  159. 返回值: 
  160.     -1:设置计算机名失败 
  161.     -2:设置计算机描述失败 
  162.      0:成功 
  163. 说明: 
  164.     要求有管理员权限,并且重新启动计算机后才有效 
  165. */  
  166. INT WINAPI SetComputerNameAndDescription(const TCHAR* szComputerName, const TCHAR* szDescription);  
  167.   
  168. /* 
  169. 功能:添加计算机用户帐户 
  170. 参数说明: 
  171.     szName:要增加的用户帐户 
  172.     szPassword:帐户密码 
  173.     szComment:注释 
  174.     szGroupName:要加入的组名 
  175. 返回值: 
  176.     错误代码     
  177. */  
  178. NET_API_STATUS WINAPI AddUserAccount(const TCHAR* szName, const TCHAR* szPassword, const TCHAR* szComment, const TCHAR* szGroupName);  
  179.   
  180. /* 
  181. 功能:禁用计算机用户帐户 
  182. 参数说明: 
  183.     szName:要禁用的用户帐户 
  184. 返回值: 
  185.     错误代码 
  186. */  
  187. NET_API_STATUS WINAPI DisableUserAccount(const TCHAR* szName);  
  188.   
  189. /*  
  190. 功能:判断用户密码是否为空 
  191. 参数说明: 
  192.     domainname:主机名,如果为NULL,则为当前登录的计算机 
  193.     username:要测试的用户帐户,如果为NULL,则为当前登录的用户 
  194. 返回值: 
  195.      1:用户密码为空 
  196.      0:用户密码不为空 
  197.     -1:其它错误,可能的错误有 
  198.         ERROR_ACCESS_DENIED 
  199.         NERR_InvalidComputer 
  200.         NERR_NotPrimary 
  201.         NERR_UserNotFound 
  202. */  
  203. INT AccountIsEmptyPassword(const WCHAR* domainname, const WCHAR* username);  
  204.   
  205. /* 
  206. 功能:验证计算机名是否合法 
  207. 参数说明: 
  208.     szName:要验证的计算机名 
  209. 返回值: 
  210.     TRUE:计算机名符合规范 
  211.     FALSE:计算机名不符合规范 
  212. 说明: 
  213.     计算机名不超过15个字符,且必须是字母、数字及连字符(-),并且不能全是数字 
  214. */  
  215. BOOL WINAPI ValidateComputerName(const TCHAR* szName);  
  216.   
  217. /* 
  218. 功能:验证用户帐号名是否合法 
  219. 参数说明: 
  220.     szName:要验证的用户名 
  221. 返回值: 
  222.     TRUE:用户名符合规范 
  223.     FALSE:用户名不符合规范 
  224. 说明: 
  225.     用户名不超过20个字符,且必须为可打印字符,不能包含【,"//[]:|<>+=;?*】,也不能全是空格字符  
  226. */  
  227. BOOL WINAPI ValidateUserAccount(const TCHAR* szName);  
  228.   
  229. /* 
  230. 功能:获取计算机名最大长度 
  231. 返回值: 
  232.     计算机名最大长度(15)     
  233. */  
  234. INT WINAPI GetMaxComputerNameLength(void);  
  235.   
  236. /* 
  237. 功能:获得最大用户帐号长度 
  238. 返回值: 
  239.     最大用户帐号长度(20) 
  240. */  
  241. INT WINAPI GetMaxUserAccountLength(void);  
  242.   
  243. /* 
  244. 功能:获得最大密码长度(字节数) 
  245. 返回值: 
  246.     用户帐号允许的最大密码长度(256字节) 
  247. 说明: 
  248.     英文密码允许256个字符,汉字密码允许128个字符 
  249. */  
  250. INT WINAPI GetMaxPasswordLength(void);  
  251.   
  252. /* 
  253. 功能:获得最大用户帐户注释长度 
  254. 返回值: 
  255.     注释、用户帐户注释、计算机全名最大长度(256) 
  256. */  
  257. INT WINAPI GetMaxCommentLength(void);  
  258.   
  259. /* 
  260. 功能:重启计算机 
  261. 返回值: 
  262.     TRUE:操作成功 
  263.     FALSE:操作失败 
  264. */  
  265. BOOL WINAPI RebootComputer(void);  
  266.   
  267. #ifdef __cplusplus   
  268. }  
  269. #endif  
  

SetX.cpp

  1. #include "SetX.h"   
  2. #include <strsafe.h>   
  3.   
  4. #pragma comment(lib, "Netapi32.lib")   
  5.   
  6. typedef struct _REG_TZI_FORMAT  
  7. {  
  8.     LONG Bias;  
  9.     LONG StandardBias;  
  10.     LONG DaylightBias;  
  11.     SYSTEMTIME StandardDate;  
  12.     SYSTEMTIME DaylightDate;  
  13. } REG_TZI_FORMAT;  
  14.   
  15. // 获取本地时区显示名及当前是否是夏令时   
  16. DWORD WINAPI GetLocalTimeZoneDisplayName(TimeZoneDisplayName *pDisplayName, BOOL &isDaylightSavingTime)  
  17. {  
  18.     DYNAMIC_TIME_ZONE_INFORMATION tzi;  
  19.     DWORD dwStatus;  
  20.   
  21.     dwStatus = GetDynamicTimeZoneInformation(&tzi);  
  22.     if (dwStatus != TIME_ZONE_ID_INVALID)  
  23.     {  
  24.         // 是否夏时制时间   
  25.         isDaylightSavingTime = !tzi.DynamicDaylightTimeDisabled;  
  26.   
  27.         // 查询注册表获取时区显示名   
  28.         if (pDisplayName != NULL)  
  29.         {  
  30.             HKEY hKey;  
  31.             TCHAR szSubKey[256];  
  32.             DWORD dwByteLen;  
  33.   
  34.             StringCchCopy(szSubKey, 256, TEXT("Software//Microsoft//Windows NT//CurrentVersion//Time Zones//"));  
  35.             StringCchCat(szSubKey, 256, tzi.TimeZoneKeyName);     
  36.             RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKey);  
  37.               
  38.             // 时区显示名   
  39.             dwByteLen = sizeof(TimeZoneDisplayName);  
  40.             RegQueryValueEx(hKey, TEXT("Display"), NULL, NULL, reinterpret_cast<LPBYTE>(pDisplayName), &dwByteLen);  
  41.             RegCloseKey(hKey);    
  42.         }  
  43.     }  
  44.   
  45.     return dwStatus;  
  46. }  
  47.   
  48. // 返回时区信息在本地系统上可用的所有时区的已排序集合   
  49. BOOL WINAPI GetSystemTimeZones(map<TimeZoneDisplayName, TimeZoneKeyName>* pMapTimeZones)  
  50. {  
  51.     const TCHAR* TimeZonesRegistryEntry = TEXT("Software//Microsoft//Windows NT//CurrentVersion//Time Zones");  
  52.   
  53.     // 检测参数   
  54.     if (pMapTimeZones == NULL)return FALSE;  
  55.   
  56.     // 清空map表   
  57.     pMapTimeZones->clear();  
  58.   
  59.     HKEY hKey;  
  60.     LONG ErrorCode;   
  61.     DWORD dwCchSize, dwIndex;  
  62.     TCHAR szSubKey[256];  
  63.     INT InsertPoint;  
  64.     TimeZoneDisplayName szDisplayName;    
  65.     TimeZoneKeyName     szKeyName;    
  66.   
  67.     // 打开注册表时区入口   
  68.     ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TimeZonesRegistryEntry, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hKey);  
  69.     if (ErrorCode != ERROR_SUCCESS)  
  70.     {  
  71.         return FALSE;  
  72.     }  
  73.   
  74.     StringCchCopy(szSubKey, 256, TimeZonesRegistryEntry);  
  75.     StringCchCat(szSubKey, 256, TEXT("//"));  
  76.     InsertPoint = _tcslen(szSubKey);  
  77.     for (dwIndex = 0; ; dwIndex++)  
  78.     {   // 枚举所有时区标识符   
  79.         dwCchSize = 128;  
  80.         ErrorCode = RegEnumKeyEx(hKey, dwIndex, szKeyName.Name, &dwCchSize, NULL, NULL, NULL, NULL);  
  81.         if (ErrorCode == ERROR_NO_MORE_ITEMS)break;  
  82.   
  83.         if (ErrorCode == ERROR_SUCCESS)  
  84.         {  
  85.             HKEY hSubKey;  
  86.   
  87.             szSubKey[InsertPoint] = 0;  
  88.             StringCchCat(szSubKey, 256, szKeyName.Name);  
  89.             ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hSubKey);  
  90.             if (ErrorCode == ERROR_SUCCESS)  
  91.             {   // 获取时区显示名   
  92.                 DWORD dwByteLen = sizeof(szDisplayName);  
  93.                 ErrorCode = RegQueryValueEx(hSubKey, TEXT("Display"), NULL, NULL, reinterpret_cast<LPBYTE>(&szDisplayName), &dwByteLen);  
  94.                 RegCloseKey(hSubKey);  
  95.                 if (ErrorCode == ERROR_SUCCESS)  
  96.                 {  
  97.                     pMapTimeZones->insert(make_pair(szDisplayName, szKeyName));  
  98.                 }  
  99.             }  
  100.         }  
  101.     }  
  102.   
  103.     RegCloseKey(hKey);  
  104.   
  105.     return TRUE;  
  106. }  
  107.   
  108. // 判断该时区是否实行夏时制   
  109. BOOL WINAPI TimeZoneIsDaylightSavingTime(const TCHAR* szTimeZoneKeyName)  
  110. {  
  111.     HKEY hKey;  
  112.     LONG ErrorCode;  
  113.     TCHAR szSubKey[256];  
  114.   
  115.     StringCchCopy(szSubKey, 256, TEXT("Software//Microsoft//Windows NT//CurrentVersion//Time Zones//"));  
  116.     StringCchCat(szSubKey, 256, szTimeZoneKeyName);   
  117.     StringCchCat(szSubKey, 256, TEXT("//Dynamic DST"));   
  118.   
  119.     ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKey);  
  120.     if (ErrorCode == ERROR_SUCCESS)  
  121.     {  
  122.         RegCloseKey(hKey);  
  123.         return TRUE;          
  124.     }  
  125.   
  126.     return FALSE;  
  127. }  
  128.   
  129. // 根据时区标识符设置本地时区   
  130. BOOL WINAPI SetLocalTimeZoneByKeyName(const TCHAR* szTimeZoneKeyName, BOOL isDaylightSavingTime)  
  131. {  
  132.     HKEY hKey;  
  133.     LONG ErrorCode;  
  134.     TCHAR szSubKey[256];  
  135.     TCHAR szStandardName[32];  
  136.     TCHAR szDaylightName[32];  
  137.     REG_TZI_FORMAT regTZI;    
  138.     DWORD dwByteLen;  
  139.   
  140.     // 检测入口参数   
  141.     if ((szTimeZoneKeyName == NULL) || (_tcslen(szTimeZoneKeyName) == 0))  
  142.     {   // 时区标识符不能为空   
  143.         return FALSE;  
  144.     }  
  145.   
  146.     StringCchCopy(szSubKey, 256, TEXT("Software//Microsoft//Windows NT//CurrentVersion//Time Zones//"));  
  147.     StringCchCat(szSubKey, 256, szTimeZoneKeyName);   
  148.     ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szSubKey, 0, KEY_QUERY_VALUE, &hKey);  
  149.     if (ErrorCode != ERROR_SUCCESS)  
  150.     {  
  151.         return FALSE;  
  152.     }  
  153.   
  154.     // 标准名   
  155.     dwByteLen = sizeof(szStandardName);  
  156.     ErrorCode = RegQueryValueEx(hKey, TEXT("Std"), NULL, NULL, reinterpret_cast<LPBYTE>(&szStandardName), &dwByteLen);  
  157.     if (ErrorCode != ERROR_SUCCESS)  
  158.     {  
  159.         RegCloseKey(hKey);  
  160.         return FALSE;  
  161.     }  
  162.   
  163.     // 夏时制名   
  164.     dwByteLen = sizeof(szDaylightName);  
  165.     ErrorCode = RegQueryValueEx(hKey, TEXT("Dlt"), NULL, NULL, reinterpret_cast<LPBYTE>(&szDaylightName), &dwByteLen);  
  166.     if (ErrorCode != ERROR_SUCCESS)  
  167.     {  
  168.         RegCloseKey(hKey);  
  169.         return FALSE;  
  170.     }  
  171.   
  172.     // 时区信息   
  173.     dwByteLen = sizeof(regTZI);  
  174.     ErrorCode = RegQueryValueEx(hKey, TEXT("TZI"), NULL, NULL, reinterpret_cast<LPBYTE>(®TZI), &dwByteLen);  
  175.     RegCloseKey(hKey);  
  176.     if ((ErrorCode != ERROR_SUCCESS) || (dwByteLen > sizeof(regTZI)))  
  177.     {  
  178.         return FALSE;  
  179.     }  
  180.   
  181.     // 开启权限   
  182.     HANDLE hToken;  
  183.     TOKEN_PRIVILEGES tkp;     
  184.     BOOL isOK;  
  185.   
  186.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken))  
  187.     {  
  188.         return FALSE;  
  189.     }  
  190.   
  191.     LookupPrivilegeValue(NULL, SE_TIME_ZONE_NAME, &tkp.Privileges[0].Luid);  
  192.     tkp.PrivilegeCount = 1;  
  193.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  194.   
  195.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);  
  196.     if (GetLastError() != ERROR_SUCCESS)  
  197.     {  
  198.         CloseHandle(hToken);  
  199.         return FALSE;  
  200.     }  
  201.   
  202.     // 设置新时区   
  203.     DYNAMIC_TIME_ZONE_INFORMATION tzi;  
  204.   
  205.     tzi.Bias = regTZI.Bias;  
  206.     StringCchCopy(tzi.StandardName, 32, szStandardName);  
  207.     tzi.StandardDate = regTZI.StandardDate;  
  208.     tzi.StandardBias = regTZI.StandardBias;       
  209.     StringCchCopy(tzi.DaylightName, 32, szDaylightName);  
  210.     tzi.DaylightDate = regTZI.DaylightDate;   
  211.     tzi.DaylightBias = regTZI.DaylightBias;           
  212.     StringCchCopy(tzi.TimeZoneKeyName, 128, szTimeZoneKeyName);  
  213.     tzi.DynamicDaylightTimeDisabled = !isDaylightSavingTime;  
  214.     isOK = SetDynamicTimeZoneInformation( &tzi );   // 设置动态时区   
  215.   
  216.     // 关闭权限   
  217.     tkp.Privileges[0].Attributes = 0;  
  218.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);  
  219.     CloseHandle(hToken);  
  220.   
  221.    return isOK;  
  222. }  
  223.   
  224. // 设置计算机名及计算机描述   
  225. INT WINAPI SetComputerNameAndDescription(const TCHAR* szComputerName, const TCHAR* szDescription)  
  226. {  
  227.     if ((szComputerName != NULL) && (_tcslen(szComputerName) != 0)) // 计算机名不能为空   
  228.     {  
  229.         // 设置计算名要求有管理员权限。改名成功后,重新启动计算机后才有效   
  230.         if (!::SetComputerNameEx(ComputerNamePhysicalDnsHostname, szComputerName))  
  231.         {   // 更改计算机名失败   
  232.             return -1;  
  233.         }  
  234.     }  
  235.   
  236.     if (szDescription != NULL)  // 计算机描述可以为空   
  237.     {  
  238.         // 更改计算机描述。要求有管理员权限。   
  239.         TCHAR szCommandLine[512];  
  240.         HINSTANCE hInstance;  
  241.         StringCchCopy(szCommandLine, sizeof(szCommandLine)/sizeof(TCHAR), TEXT("/c net config server /SRVCOMMENT:/""));  
  242.         StringCchCat(szCommandLine, sizeof(szCommandLine)/sizeof(TCHAR), szDescription);  
  243.         StringCchCat(szCommandLine, sizeof(szCommandLine)/sizeof(TCHAR), TEXT("/""));  
  244.   
  245.         hInstance = ShellExecute(NULL, NULL, TEXT("cmd.exe"), szCommandLine, NULL, SW_HIDE);  
  246.         if (reinterpret_cast<int>(hInstance) <= 32)      
  247.         {   // 更改计算机描述失败   
  248.             return -2;  
  249.         }  
  250.     }  
  251.   
  252.     return 0;  
  253. }  
  254.   
  255. // 添加用户帐户并加入指定组   
  256. NET_API_STATUS WINAPI AddUserAccount(const TCHAR* szName, const TCHAR* szPassword, const TCHAR* szComment, const TCHAR* szGroupName)  
  257. {  
  258.     USER_INFO_1 ui = {0};   // 预先初始化   
  259.     NET_API_STATUS nStatus;  
  260.   
  261.     if ((szName == NULL) || (_tcslen(szName) == 0))  
  262.     {   // 用户名不能为空   
  263.         return ERROR_INVALID_PARAMETER;   
  264.     }  
  265.   
  266.     ui.usri1_name = const_cast<TCHAR*>(szName);  
  267.     ui.usri1_password = const_cast<TCHAR*>(szPassword);  
  268.     ui.usri1_comment = const_cast<TCHAR*>(szComment);  
  269.     ui.usri1_priv = USER_PRIV_USER;  
  270.     ui.usri1_flags = UF_SCRIPT | UF_DONT_EXPIRE_PASSWD; // 开机登录用户名   
  271.   
  272.     // 添加用户帐户   
  273.     nStatus = NetUserAdd(NULL, 1, reinterpret_cast<LPBYTE>(&ui), NULL);  
  274.     if (nStatus == NERR_Success)  
  275.     {   // 将用户加入组   
  276.         if ((szGroupName != NULL) && (_tcslen(szGroupName) != 0))  
  277.         {  
  278.             LOCALGROUP_MEMBERS_INFO_3 lgmi;  
  279.   
  280.             lgmi.lgrmi3_domainandname = const_cast<TCHAR*>(szName);  
  281.             nStatus = NetLocalGroupAddMembers(NULL, szGroupName, 3, reinterpret_cast<LPBYTE>(&lgmi), 1);   
  282.         }  
  283.     }  
  284.       
  285.     return nStatus;  
  286. }  
  287.   
  288. // 禁用用户帐号   
  289. NET_API_STATUS WINAPI DisableUserAccount(const TCHAR* szName)  
  290. {     
  291.     if ((szName == NULL) || (_tcslen(szName) == 0))  
  292.     {   // 用户名不能为空   
  293.         return ERROR_INVALID_PARAMETER;   
  294.     }  
  295.   
  296.     NET_API_STATUS nStatus;  
  297.     LPUSER_INFO_1 pBuf = NULL;  
  298.   
  299.     nStatus = NetUserGetInfo(NULL, szName, 1, reinterpret_cast<LPBYTE*>(&pBuf));  
  300.     if (nStatus == NERR_Success)  
  301.     {  
  302.         USER_INFO_1008 ui;  
  303.   
  304.         ui.usri1008_flags = (*pBuf).usri1_flags | UF_ACCOUNTDISABLE;  
  305.         nStatus = NetUserSetInfo(NULL, szName, 1008, reinterpret_cast<LPBYTE>(&ui), NULL);  
  306.     }  
  307.   
  308.     if (pBuf != NULL)  
  309.     {  
  310.         NetApiBufferFree(pBuf);  
  311.     }  
  312.   
  313.     return nStatus;  
  314. }  
  315.   
  316. // 判断用户密码是否为空   
  317. INT AccountIsEmptyPassword(const WCHAR* domainname, const WCHAR* username)  
  318. {  
  319.     NET_API_STATUS dwStatus;  
  320.   
  321.     dwStatus = NetUserChangePassword(domainname, username, L"", L"");  
  322.     if ((dwStatus == NERR_Success) || (dwStatus == NERR_PasswordTooShort))  
  323.     {   // 密码为空   
  324.         return 1;  
  325.     }  
  326.     else if(dwStatus == ERROR_INVALID_PASSWORD)  
  327.     {   // 密码不为空   
  328.         return 0;  
  329.     }  
  330.     else  
  331.     {   // 其它错误   
  332.         return -1;  
  333.     }  
  334. }  
  335.   
  336. // 获得最大计算机名长度   
  337. INT WINAPI GetMaxComputerNameLength(void)  
  338. {  
  339.     return MAX_COMPUTERNAME_LENGTH; // 15   
  340. }  
  341.   
  342. // 获得最大用户帐号长度   
  343. INT WINAPI GetMaxUserAccountLength(void)  
  344. {  
  345.     return LM20_UNLEN;  // 20   
  346. }  
  347.   
  348. // 获得最大用户帐户注释长度   
  349. INT WINAPI GetMaxCommentLength(void)  
  350. {  
  351.     return MAXCOMMENTSZ;    // 256   
  352. }  
  353.   
  354. // 获得最大密码长度(字节数)   
  355. INT WINAPI GetMaxPasswordLength(void)  
  356. {   
  357.     return PWLEN;   // 256   
  358. }  
  359.   
  360. // 验证计算机名是否合法   
  361. BOOL WINAPI ValidateComputerName(const TCHAR* szName)  
  362. {  
  363.     // 允许字符白名单   
  364.     const TCHAR* WHITELIST = TEXT("-");  
  365.   
  366.     if (szName == NULL)return FALSE;  
  367.       
  368.     UINT uiLen = _tcslen(szName);  
  369.     if ((uiLen == 0) || (uiLen > MAX_COMPUTERNAME_LENGTH))  
  370.     {   // 用户名不能超过20个字符   
  371.         return FALSE;  
  372.     }  
  373.   
  374.     BOOL isAllDigit = TRUE;  
  375.     for (UINT i = 0; i < uiLen; i++)  
  376.     {  
  377.         TCHAR ch = szName[i];  
  378.   
  379.         if (!_istalnum(ch) && (_tcschr(WHITELIST, ch) == NULL))  
  380.         {   // 不是字母数字,也不是白名单字符   
  381.             return FALSE;  
  382.         }  
  383.   
  384.         if (isAllDigit)  
  385.         {  
  386.             if (!_istdigit(ch))  
  387.             {  
  388.                 isAllDigit = FALSE;  
  389.             }  
  390.         }  
  391.     }  
  392.   
  393.     if (isAllDigit)  
  394.         return FALSE;   // 计算机名不能全是数字   
  395.     else  
  396.         return TRUE;  
  397. }  
  398.   
  399. // 验证用户帐号名是否合法   
  400. BOOL WINAPI ValidateUserAccount(const TCHAR* szName)  
  401. {  
  402.     // 禁止字符黑名单   
  403.     const TCHAR* BLACKLIST = TEXT(",/"///[]:|<>+=;?*");   
  404.   
  405.     if (szName == NULL)return FALSE;  
  406.   
  407.     // 不能是内置帐户   
  408.     if(_tcsicmp(szName, TEXT("Administrator")) == 0 || _tcsicmp(szName, TEXT("Guest")) == 0)  
  409.     {   // 用户帐户不区分大小写   
  410.         return FALSE;  
  411.     }  
  412.   
  413.     UINT uiLen = _tcslen(szName);  
  414.     if ((uiLen == 0) || (uiLen > LM20_UNLEN))  
  415.     {   // 用户名不能超过20个字符   
  416.         return FALSE;  
  417.     }  
  418.   
  419.     BOOL isAllSpace = TRUE;  
  420.     for (UINT i = 0; i < uiLen; i++)  
  421.     {  
  422.         TCHAR ch = szName[i];  
  423.         if (ch < TEXT(' '))  
  424.         {   // 用户名不能是非打印字符   
  425.             return FALSE;  
  426.         }  
  427.         else if (_tcschr(BLACKLIST, ch) != NULL)  
  428.         {   // 不能含有黑名单字符   
  429.             return FALSE;  
  430.         }  
  431.   
  432.         if (isAllSpace)  
  433.         {  
  434.             if (ch != TEXT(' '))  
  435.             {  
  436.                 isAllSpace = FALSE;  
  437.             }  
  438.         }  
  439.     }  
  440.   
  441.     if (isAllSpace)  
  442.         return FALSE;   // 用户名不能全是空格组成   
  443.     else  
  444.         return TRUE;  
  445. }  
  446.   
  447. // 重启计算机   
  448. BOOL WINAPI RebootComputer(void)  
  449. {  
  450.     HANDLE hToken;  
  451.     TOKEN_PRIVILEGES tkp;   
  452.   
  453.     // 访问令牌   
  454.     if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))  
  455.     {  
  456.       return FALSE;   
  457.     }  
  458.   
  459.     // 设置权限   
  460.     LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);  
  461.     tkp.PrivilegeCount = 1;  
  462.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  463.   
  464.     // 调整权限   
  465.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);  
  466.     if (GetLastError() != ERROR_SUCCESS)  
  467.     {  
  468.         CloseHandle(hToken);  
  469.         return FALSE;   
  470.     }  
  471.       
  472.     // 关机重启   
  473.     return ExitWindowsEx(EWX_REBOOT | EWX_FORCEIFHUNG, SHTDN_REASON_MAJOR_APPLICATION | SHTDN_REASON_MINOR_MAINTENANCE | SHTDN_REASON_FLAG_PLANNED);  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值