zoukankan      html  css  js  c++  java
  • xp_cmdshell 存储过程应用示例(C#),包含 DataReader 转换到 DataSet 过程

        最近非常想找个项目做一下,一方面可以积累些项目经验,另外也可增加点实战知识。。。为年后找工作铺垫一下,毕竟现在没有项目经验自己心里都有点底气不足~

        xp_cmdshell 是黑客们喜欢使用的一个存储过程,当然默认情况下是禁用的(如何启用就不要问我了)。如果有SQL的SA权限,使用这个存储过程可以非常轻易的获取 Windows 系统的管理员权限,比如:xp_cmdshell "net user tstuser /add",就给 Windows 系统增加了一个用户,然后再 net LOCALGROUP administrators tst /add 就把 tst 用户的权限提升为 administrators 了,微软在方便的用户的同时也给系统管理员带来了不少麻烦,这大概不是初衷。

        其实在 windows 2000 以后的 windows 平台上对权限的分配已经是非常严谨了,不是随随便便就可以执行这些高级命令的。。。闲话到此为止!

        闲来无事写的这段代码,其实没有什么实际意义(学习例外),因为在 .net 平台中 ASP.NET 的运行权限是 PowerUser 组,所以当这段代码传到虚拟空间上的时候是不能执行的,不过作为参考学习一下,还是可以看看!

    Code
        /// <summary>
        
    /// 利用 xp_cmdshell 命令返回 dos 命令结果
        
    /// </summary>
        
    /// <param name="command">dos 命令</param>
        
    /// <returns>DataSet 类型</returns>
        DataSet GetCmdShell(string command)
        {
            SqlConnection cn 
    = new SqlConnection(cns);

            DataSet ds 
    = new DataSet();
            DataTable dt 
    = new DataTable();

            
    try
            {
                SqlCommand cmd 
    = new SqlCommand();
                cmd.Connection 
    = cn;
                cmd.CommandText 
    = "xp_cmdshell";
                cmd.CommandType 
    = CommandType.StoredProcedure;

                SqlParameter param 
    = new SqlParameter("@command", SqlDbType.NVarChar, 1000);
                param.Value 
    = command;

                
    //添加 DOS 命令
                cmd.Parameters.Add(param);

                SqlDataReader reader;
                cn.Open();

                reader 
    = cmd.ExecuteReader(CommandBehavior.CloseConnection);

                
    int fieldCount = reader.FieldCount;

                
    //添加表的字段名称和类型
                for (int i = 0; i < fieldCount; i++)
                    dt.Columns.Add(reader.GetName(i), reader.GetFieldType(i));

                
    object[] values = new object[fieldCount];
                
    while (reader.Read())
                {
                    
    //循环添加每一行记录到 DataTable
                    reader.GetValues(values);
                    dt.LoadDataRow(values, 
    true);
                }

                reader.Close();
                cmd.Dispose();
                dt.EndLoadData();
            }
            
    catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

            ds.Tables.Add(dt);

            
    return ds;

        }

  • 相关阅读:
    分布式存储-Redis&常用数据库(Profile)
    高并发(outline&factors)
    高可用&高并发(从架构&代码层面出发)
    消息中间件-RabbitMq(可靠性方案&死信队列&监控)
    消息中间件-RabbitMq(高可用方案&集群搭建)
    消息中间件-RabbitMq(搭建&消息分发)
    消息中间件-介绍
    cmake多目录构建项目
    cmake单目录构建项目
    cmake安装
  • 原文地址:https://www.cnblogs.com/jarod99/p/1377652.html
Copyright © 2011-2022 走看看