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;

    }

原文地址:https://www.cnblogs.com/jarod99/p/1377652.html