- /*3389登录日志清除软件*/
- #include <windows.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- void Usage(char *progname);
- void OpenKey(char *key);
- void DelKey(char *key,char *value);
- void QueryKey(char *key,char *value);
- void ValidateArgs(int argc, char **argv);
- int j=1;
- int main(int argc, char** argv)
- {
- //解析命令行输入:
- ValidateArgs(argc, argv);
- return 0;
- }
- //输出帮助的典型方法:
- void Usage (char *progname)
- {
- fprintf(stdout,"===============================================================================\\n"
- "\\t名称:3389登录日志清除软件\\n"
- "\\t举例: clear3389 -h\\n"
- "\\t \\"clear3389 -h\\" //帮助信息\\n"
- "\\t \\"clear3389 -a\\" //显示本机3389所有登录记录\\n"
- "\\t \\"clear3389 -d MRU9\\" //删除指定的3389登录记录\\n"
- "===============================================================================\\n");
- exit(0);
- }
- //解析命令行输入的典型方法:
- void ValidateArgs(int argc, char **argv)
- {
- //打开指定的注册表键:
- char *Key="Software\\\\Microsoft\\\\Terminal Server Client\\\\Default";
- char buff[100]={0};
- int i,i1,length;
- if(argc<2)
- {
- Usage(argv[0]);
- }
- for(i=1;i<argc;i++)
- {
- if ((argv[i][0] == '-') || (argv[i][0] == '/'))
- {
- switch (tolower(argv[i][1])) //转换成小写字母
- {
- case 'd': //删除指定的3389登录记录
- if (argc!=3)
- Usage(argv[0]);
- strcpy(buff,argv[2]);
- length = strlen(argv[2]);
- for (i1=0; i1<length; i1++)
- {
- buff[i1] = toupper(buff[i1]);
- }
- //printf("buff=%s\\n",buff);
- QueryKey(Key,buff);
- exit(0);
- case 'h'://打印帮助
- Usage(argv[0]);
- exit(0);
- case 'a': //显示本机3389所有登录记录
- if (argc!=2)
- Usage(argv[0]);
- OpenKey(Key);
- exit(0);
- default:
- Usage(argv[0]);
- return;
- }
- }
- }
- printf("继续...\\n");
- return;
- }
- //下面是列出所有键值:
- void OpenKey(char *key)
- {
- HKEY hkey;//注册表键值的句柄
- DWORD dwIndex=0,Index=0,lpcbname=1000,ret=0,Type=0,namesize=1500;
- char *T_name=(char *)malloc(1000);
- unsigned char *name=(unsigned char *)malloc(1500);//保存子键名的字符数组
- int i=0;
- //下面是字符数组清0:
- //ZeroMemory(Buffer,1000);
- //ZeroMemory(T_name,1000);
- ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
- key, //传递一个参数,欲打开的注册表项
- 0, //未用,设为0即可
- KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
- //它们的组合描述了允许对这个项进行哪些操作
- &hkey); //装载上面打开项的句柄
- //printf("ret=%x\\n",ret);
- if(ret!=ERROR_SUCCESS) {
- printf("RegOpenKeyEx error! %x\\n",GetLastError());
- return ;
- }
- printf("\\n(%d)本机的3389登录项目为:\\n",j++);
- printf("key=HKEY_CURRENT_USER\\\\%s\\n",key);
- for(i=1;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值
- {
- ret=RegEnumValue(hkey,dwIndex,T_name,&lpcbname,
- NULL,&Type,name,&namesize);
- //dwIndex:欲获取的子项的索引。第一个子项的索引编号为零
- //T_name:用于装载指定索引处项名的一个缓冲区
- //&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。
- if(Type==REG_SZ)
- {
- printf("%d.数值名称:%s\\n",i,T_name);
- printf(" 数值键值:\\"%s\\"\\n",name);
- printf(" 数据类型:REG_SZ\\n\\n");
- }
- if(Type==REG_DWORD)
- {
- printf("类型为REG_DWORD!\\n");
- }
- ZeroMemory(T_name,1000);
- lpcbname=1000;
- ZeroMemory(name,1500);
- namesize=1500;
- }
- RegCloseKey(hkey); //关闭注册键
- free(T_name);
- free(name);
- }
- //下面是查询指定的键值:
- void QueryKey(char *key,char *value)
- {
- HKEY hkey;//注册表键值的句柄
- DWORD dwIndex=0,Index=0,lpcbname=1000,ret=0,Type=0,namesize=1500;
- char *T_name=(char *)malloc(1000);
- unsigned char *name=(unsigned char *)malloc(1500);//保存子键名的字符数组
- int i=0,ret1=0;
- //下面是字符数组清0:
- //ZeroMemory(Buffer,1000);
- //ZeroMemory(T_name,1000);
- ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
- key, //传递一个参数,欲打开的注册表项
- 0, //未用,设为0即可
- KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
- //它们的组合描述了允许对这个项进行哪些操作
- &hkey); //装载上面打开项的句柄
- //printf("ret=%x\\n",ret);
- if(ret!=ERROR_SUCCESS) {
- printf("RegOpenKeyEx error! %x\\n",GetLastError());
- return ;
- }
- printf("\\n(%d)本机的3389登录项目为:\\n",j++);
- printf("key=HKEY_CURRENT_USER\\\\%s\\n",key);
- for(i=1;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值
- {
- ret=RegEnumValue(hkey,dwIndex,T_name,&lpcbname,
- NULL,&Type,name,&namesize);
- //dwIndex:欲获取的子项的索引。第一个子项的索引编号为零
- //T_name:用于装载指定索引处项名的一个缓冲区
- //&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)
- if(stricmp(T_name,value)==0){
- if(Type==REG_SZ)
- {
- printf("%d.数值名称:%s\\n",i,T_name);
- printf(" 数值键值:\\"%s\\"\\n",name);
- printf(" 数据类型:REG_SZ\\n\\n");
- ret1=1;
- DelKey(key,value);
- }
- if(Type==REG_DWORD)
- {
- printf("类型为REG_DWORD!\\n");
- }
- }
- ZeroMemory(T_name,1000);
- lpcbname=1000;
- ZeroMemory(name,1500);
- namesize=1500;
- }
- if(!ret1)
- { printf("\\n注意:数值名称%s不存在,请重新输入,注意大小写!\\n",value);
- }
- RegCloseKey(hkey); //关闭注册键
- free(T_name);
- free(name);
- }
- //下面是删除指定的键值:
- void DelKey(char *key,char *value)
- {
- HKEY hkey;
- DWORD ret;
- ret=RegOpenKeyEx(HKEY_CURRENT_USER, //根键名或已打开项的句柄
- key, //传递一个参数,欲打开的注册表项
- 0, //未用,设为0即可
- KEY_ALL_ACCESS, //描述新键值安全性的访问掩码
- //它们的组合描述了允许对这个项进行哪些操作
- &hkey); //装载上面打开项的句柄
- if(ret!=ERROR_SUCCESS) {
- printf("RegOpenKeyEx error! %x\\n",GetLastError());
- return ;
- }
- ret=RegDeleteValue(hkey, value);
- if(ret!=ERROR_SUCCESS) {
- printf("RegDeleteValue %s error! %x\\n",value,GetLastError());
- return ;
- }
- printf("RegDeleteValue %s success!\\n",value);
- RegCloseKey(hkey);
- }
- //该片段来自于http://www.codesnippet.cn/detail/130220148707.html
来源: http://www.codesnippet.cn/detail/130220148707.html