清除3389远程登录日志

 更新时间:2020年4月25日 17:42  点击:1550
复制代码 代码如下:

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

}
[!--infotagslink--]

相关文章

  • Laravel 调试工具 laravel-debugbar 打印日志消息

    laravel-debugbar 调试工具的教程小编整理了几篇不错的教程,今天我们来看一篇Laravel 调试工具 laravel-debugbar 打印日志消息例子,希望文章对各位有帮助。 其实不...2016-11-25
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • Powershell 查询 Windows 日志的方法

    这篇文章主要介绍了Powershell 查询 Windows 日志的方法,需要的朋友可以参考下...2020-06-30
  • C#实现线程安全的简易日志记录方法

    这篇文章主要介绍了C#实现线程安全的简易日志记录方法,比较实用的功能,需要的朋友可以参考下...2020-06-25
  • c# 用Dictionary实现日志数据批量插入

    这篇文章主要介绍了c# 用Dictionary实现日志数据批量插入的步骤,帮助大家更好的理解和使用c#中的Dictionary类,感兴趣的朋友可以了解下...2021-02-01
  • C#3.0使用EventLog类写Windows事件日志的方法

    这篇文章主要介绍了C#3.0使用EventLog类写Windows事件日志的方法,以简单实例形式分析了C#写windows事件日志的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • c#快速写本地日志方法

    下面小编就为大家分享一篇c#快速写本地日志方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • Java SSM框架如何添加写日志功能

    这篇文章主要介绍了Java SSM框架如何添加写日志功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-25
  • sql server日志处理不当造成的隐患详解

    这篇文章主要给大家介绍了关于sql server日志处理不当造成的隐患的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用sql server具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
  • springboot启动时没有日志的原因分析

    这篇文章主要介绍了springboot启动时没有日志的原因分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-27
  • Nginx访问日志及错误日志参数说明

    这篇文章主要介绍了Nginx访问日志及错误日志参数说明,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-14
  • C#写日志类实例

    这篇文章主要介绍了C#写日志类,实现将日志信息写入文本文件的功能,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • Nginx自定义访问日志的配置方式

    Nginx日志主要分为两种:访问日志和错误日志。访问日志主要记录客户端访问Nginx的每一个请求,格式可以自定义。下面这篇文章主要给大家介绍了Nginx自定义访问日志的配置方式,需要的朋友可以参考学习,下面来一起看看吧。...2017-07-06
  • php性能分析之php-fpm慢执行日志slow log用法浅析

    这篇文章主要介绍了php性能分析之php-fpm慢执行日志slow log用法,结合实例形式分析了php慢执行日志的功能与相关使用技巧,需要的朋友可以参考下...2016-10-20
  • MySQL中开启和使用通用查询日志的实例教程

    这篇文章主要介绍了MySQL中开启和使用通用查询日志的实例教程,包括其备份和关闭等基础操作的例子讲解,需要的朋友可以参考下...2015-12-25
  • SpringBoot集成slf4j日志配置的方法

    本文主要介绍了SpringBoot集成slf4j日志配置的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-29
  • MongoDB中4种日志的详细介绍

    这篇文章主要给大家介绍了关于MongoDB中4种日志的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-11
  • 怎么清除sql server日志

    方法1: 第一步: backup log database_name with no_log 或者 backup log database_name with truncate_only --no_log和truncate_only是在这里是同义的,随便执行哪一句...2016-11-25
  • C#实现将程序运行信息写入日志的方法

    这篇文章主要介绍了C#实现将程序运行信息写入日志的方法,可实现将程序运行信息写入日志并存储在Debug目录下的"/Log/PRG"下的功能,涉及C#针对日志的相关写入技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php的慢速日志引起的Mysql 2013错误怎么办

    php的慢速日志引起的Mysql 2013错误怎么办,下面我们就一起来看看这个问题的解决办法,希望例子能够帮助到各位。 Description: ———— If...2016-11-25