服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 清除3389远程登录日志

清除3389远程登录日志

2021-01-14 16:34C语言教程网 C/C++

这篇文章主要介绍了清除3389远程登录日志示例,需要的朋友可以参考下

复制代码 代码如下:


/*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);

}

//-------------------------------------------------
/*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);

}

延伸 · 阅读

精彩推荐
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29