1

Тема: HTA: SQLToolz

Многофункциональная утилита для работы с базами данных.

<HTML>
<HEAD>
<TITLE>SQL TOOLZ ( Author - null )</TITLE>
<META content=JavaScript name=vs_defaultClientScript>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<SCRIPT language=javascript>
<!-- скрыть скрипт от браузеров не поддерживающих их
var flag=0;  // переменная для определения был ли сделан запрос на поиск sql сереверов в сети
var odbclistarr = new Array();  // массив в котром хранятся имена всех Odbc источников данных
var sqlserverlistarr = new Array(); // массив в котром хранятся имена всех найденных в сети sql серверов 
var AllArray = new Array();
var interval="";   // интервал по истечении которого будет запускаться функуция SHOW PROCESSLIST для сервера MySql
var DSNSqlserver="";   // если эта переменная не пустая, значит пользователь хочет выполнить запрос к Sql серверу

function resize()    // изменение размера окна к приемлемому виду
  {
  window.window.resizeTo(1024,768);
  }

//инструменты для работы с скуль серверами и другими базами, возможно этой функции не будет в дальнейшем
function raznoe()
  {
  if (raznoechoise.value == "odbc") // если выбран пункт - источники данных odbc, то выводим список источников данных (функция списка источников данных - сперта гдето с нэта)
    {
    var odbcsource="";         // инициализируем переменную в котрую будет записан список источников данных
    resultat.innerText=odbcsource;                       // очищаем поле "результат"
    sRegPath = "Software\\ODBC\\ODBC.INI";              // путь в реестре к источникам данных
    oLoc = new ActiveXObject("WbemScripting.SWbemLocator"); // создаем wmi объект с помощью которого переберем все ключи в ключе ODBC.INI
    oSvc = oLoc.ConnectServer(null, "root\\default");       // соединяемся с сервером wmi (локально)
    oReg = oSvc.Get("StdRegProv");                        //не знаю чё тут написано :)
    oMethod = oReg.Methods_.Item("EnumKey");             
    oInParam = oMethod.InParameters.SpawnInstance_();     // чё то связанное с асинхронным запросом вроде
    oInParam.hDefKey = '&H80000002';                      // HKLM
    oInParam.sSubKeyName = sRegPath;                      //
    oOutParam = oReg.ExecMethod_(oMethod.Name, oInParam);
    aNames = oOutParam.sNames.toArray();
    for (i = 0; i < aNames.length; i++)
      {
      oMethod = oReg.Methods_.Item("GetStringValue");
      oInParam = oMethod.InParameters.SpawnInstance_();
      oInParam.hDefKey = '&H80000002';                    // HKLM
      oInParam.sSubKeyName = sRegPath;
      oInParam.sValueName = aNames[i];
      oOutParam = oReg.ExecMethod_(oMethod.Name, oInParam);
      if ((aNames[i]!="ODBC Data Sources") & (aNames[i]!="ODBC File DSN") ) // в ключе с источниками данных, есть две ненужные записи. Выкидываем их
        {
        odbcsource=odbcsource+aNames[i]+"\n"; // результат - список источников данных
        }
      }
      resultat.innerText=odbcsource;  // записываем список источников данных в текстовое поле
    }
    
  if (raznoechoise.value == "createmdb")  //создаем базу данных mdb
    {
    dbname=window.prompt("ВВЕДИТЕ ПУТЬ К СОЗДАВАЕМОЙ БАЗЕ ДАННЫХ","c:\\Database.mdb"); //выводим окно с запросом имени файла для базы данных
    var Catalog = new ActiveXObject ("ADOX.Catalog");
    Catalog.Create ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+dbname);  //создаем базу
    }
   
  if (raznoechoise.value =="listtables")  // список таблиц источника данных, получаемый путем обращения к схеме
    {
    checked=DataSourceChoise("odbc");
    if (checked==1)
      { 
      var objConn = new ActiveXObject ("ADODB.Connection") ; 
      var objRecordset = new ActiveXObject ("ADODB.RecordSet");
      adSchemaTables=20;                                        //переменная для получения списка таблиц из схемы
      var listtables="";
      window.resultat.innerText="";                              //очищаем поле результата перед выводом в него списка таблиц
      objConn.ConnectionString="DSN="+window.dbsource.value;      // строка для соединения с источником данных
      objConn.Open();
      objRecordset = objConn.OpenSchema(adSchemaTables);   //получаем список таблиц
      while ( !objRecordset.EOF)   // в цикле записываем список таблиц в переменную listtables
        {
        listtables=listtables+objRecordset("table_name")+"\n";
        objRecordset.MoveNext;
        }
      window.resultat.innerText= listtables;      //помещаем результат в текстовое поле
      objRecordset.Close;
        }
      }
    }
    
function DataSourceChoise(type)          // самая мудрёная и хитрая функция для определения - правильно ли выбрал пользователь источник данных или sql сервер и ввел ли имя пользователя и пароль для sql сервера 
  {
  var serverlist=0;              // переменная определяющая - был ли выбран источник данных или sql сервер
  DSNSqlserver="";
  if (type=="sqlserver")  
    {
    datatype=sqlserverlistarr;   // datatype присваиваем значения массива со списком sql серверов
    }
  if (type=="odbc")     // если ф-я была вызвана с запросом определиться ODBC источниками данных
    {
    datatype=odbclistarr;    // datatype присваиваем значения массива со списком ODBC источников данных
    }
  if (type=="all")         //// если ф-я была вызвана с запросом определиться любым источнико данных или sql сервером, то в массив AllArray записываем все строки из массивов со списком источников дааных и sql серверов
    {
    for (i=1;i<odbclistarr.length;i++)
      {
      AllArray[i]=odbclistarr[i];
      }
    for (i=1;i<sqlserverlistarr.length;i++)
      {
      AllArray[odbclistarr.length+(i-1)]=sqlserverlistarr[i];
      }
    datatype=AllArray;
    }
  // если запись в поле dbsource совпадет с одной из строк из массива со список источников данных или sql серверов (в зависимости от того с каим параметром была вызвана функция), то функция возратит 1, иначе 0  
  for (i=0;i<=datatype.length;i++) 
    {
    if (window.dbsource.value != datatype[i]) 
      {
      serverlist=0;   // присваиваем переменной serverlist значение ноль,  если значение выбранного поля в dbsource не совпало ни с одним занчением из массива (списка источников данных и/или sql серверов (в зависимости от того с каким параметром была вызвана функция))
      }
    else
      // если значение выбранного поля в dbsource совпало с одним из значений списка то serverlist=1 и если функция была вызвана с параметром all, то определяем что именно выбрано - источник данных или sql сервер, в зависимости от результата выдаем соответствующие сообщения - если не хватает каких либо параметров (напрмер имени юзера и пароля для sql сервера)
      {
      serverlist=1;
      if ((type=="all") & (i>=odbclistarr.length))
        {
        type="sqlserver";
        }
      if ((type=="all") & (i<odbclistarr.length))
        {
        type="odbc";
        DSNSqlserver="DSN="+window.dbsource.value;
        }   
      if ((type=="sqlserver") & (window.winauth.checked == false))
        {
        DSNSqlserver="Driver={SQL Server}; Server="+window.dbsource.value+"; Database="+window.databasename.value+"; Uid="+window.login.value+"; Pwd="+window.pass.value+";";
        }
      if ((type=="sqlserver") & (window.winauth.checked == true))
        {
        DSNSqlserver="Driver={SQL Server}; Server="+window.dbsource.value+"; Database="+window.databasename.value+"; Trusted_Connection=yes";
        }
      if (type=="odbc")
        {
        DSNSqlserver="DSN="+window.dbsource.value;
        }
      break;
      }
    }
  // тут и так всё понятно
  if ( (serverlist == 0) & (type=="sqlserver") )
    {
    alert ("Не задано (или неправильно задано) имя Sql сервера\nВыберите имя Sql сервера из списка источников данных");
    }
  if ( (serverlist == 0) && (type=="odbc") )
    {
    alert ("Не указан (или неправильно указан) источник данных ODBC! Выберите источник данных ODBC из выпадающего списка");
    }
  if ( (type=="sqlserver") & (window.winauth.checked == false) )
    {
    if ((window.login.value =="") | (window.pass.value == ""))
      {
      alert("Введите имя пользователя и/или пароль, для подключения к Sql Server-у, \nили установите режим аутентификациии - windows!!!");
      serverlist=0;
      }
    }
  if ( (serverlist == 0) & (type=="all") )
    {
    alert ("Выберите из списка Источник данных или Sql Server");
    }
  return serverlist;
  }

function SqlServer()                    // функция для работы с sql сервером
  {
  // список sql серверов в локальной сети
  if (SqlServerChoise.value == "sqlserverslist")   
    {
    var oSQLApp = new ActiveXObject ("SQLDMO.Application")  //инициируем объект
    var Names = oSQLApp.ListAvailableSQLServers();  // присваиваем переменной список серверов в сети
    servers="";
    window.resultat.innerText=" ";   // очищаем поле результата в которое будет записан список серверов
    for (i= 1; i<= Names.Count; i++)  // в цикле читаем список  и записываем в поле
      {
      servers=servers+Names.Item(i)+"\n";
      }
      window.resultat.innerText=servers;
    }
  // свойства скуль сервера
  if (SqlServerChoise.value=="ServerProperty")  
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)                                    // если были введены имя сервера логин и пароль то
      {
      property="";                       // создаем строковую переменную для внесения в неё списка свойств sql сервера
      var oServer = new ActiveXObject ("SQLDMO.SQLServer2");     //создаем объект
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true
        oServer.Connect(window.dbsource.value);
        }
      // список свойств сервера
      property=property+"Кодовая страница сервера - "+oServer.CodePage +"\n";
      property=property+"Имя Sql сервера - " +oServer.Name+ "\n";
      property=property+"Реальное сетевое имя SQL Server - " +oServer.NetName +"\n";
      property=property+"Региональные установки, для драйвера ODBC - " +oServer.RegionalSetting +"\n";
      property=property+"Обладаете ли вы правами админа на сервере - " +oServer.SaLogin +"\n";
    
      property=property+"Cостояние SQL Servera - ";
       
      switch (oServer.Status)
        {
        case 0:
        property=property+"не определено\n";
        break;
        case 1 :
        property=property+"рабочее состояние\n";
        break;
        case 2 :
        property=property+"пауза\n";
        break;
        case 3 :
        property=property+"остановлен\n";
        break;
        case 4 :
        property=property+"переход из состояния \"остановлено\" в состояние \"запущено\"\n";
        break;
        case 5 :
        property=property+"переход: из \"запущено\" в \"остановлено\"\n";
        break;
        case 6 :
        property=property+"сервер запускается после приостановки работы\n";
        break;
        case 7 :
        property=property+"работа сервера приостанавливается\n";
        break;
        } 
      property=property+"Редакция SQL Server - ";
      versionserver=oServer.IsPackage();
      switch (versionserver)
        {
        case 0:
        property=property+"не определено\n";
        break;
        case 1 :
        property=property+"Desktop Edition\n";
        break;
        case 2 :
        property=property+"Standart Sdition\n";
        break;
        case 3 :
        property=property+"Enterprice или Developer edition\n";
        break;
        }
             
      window.resultat.innerText=property;        //записываем результат в поле
      oServer.Disconnect();   //отсоединяемся от сервера
      }
    }
  if (SqlServerChoise.value == "adSchemaCatalogs")    // функция получения списка баз данных sql сервера
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)
      {
      var objConn = new ActiveXObject ("ADODB.Connection") ; 
      var objRecordset = new ActiveXObject ("ADODB.RecordSet");
      objConn.ConnectionString=DSNSqlserver;
      objConn.Open();
      objRecordset = objConn.OpenSchema(1); // 1- adSchemaCatalogs 
      dblist=objRecordset.GetString;
      window.resultat.innerText=dblist;
      }
    }      
  if (SqlServerChoise.value == "EnumProcesses")    // функция получения списка процессов sql сервера
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)
      {
      var oServer = new ActiveXObject ("SQLDMO.SQLServer");     //создаем объект
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу, sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true               
        oServer.Connect(window.dbsource.value);     //либо windows аутентификация
        }
      var Processes = oServer.EnumProcesses();    //получаем список процессов на сервере
      //засовываем результат в excel
      var oXL = new ActiveXObject ("Excel.Application");
      oXL.Visible = true;
      oXL.Caption = "Enum Processes Sql Server";          
      oXL.WorkBooks.Add();
      for (i=1;i<=Processes.Columns;i++)
        {
        oXL.ActiveCell.Cells(1,i) = Processes.ColumnName(i);
        for (j=1;j<=Processes.Rows;j++)
          {
          oXL.ActiveCell.Cells(j+2,i) = Processes.GetColumnString(j,i);
          }
        } 
      }
    }
  if (SqlServerChoise.value == "EnumLocks")    // функция получения списка блокировок sql сервера
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)
      {
      var oServer = new ActiveXObject ("SQLDMO.SQLServer");     //создаем объект
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true
        oServer.Connect(window.dbsource.value);      //либо windows аутентификация
        }
      var locks = oServer.EnumLocks();                      //получаем список процессов на сервере
      //засовываем результат в excel
      var oXL = new ActiveXObject ("Excel.Application");
      oXL.Visible = true;
      oXL.Caption = "Enum Locks Sql Server";          
      oXL.WorkBooks.Add();
      for (i=1;i<=locks.Columns;i++)
        {
        oXL.ActiveCell.Cells(1,i) = locks.ColumnName(i);
        for (j=1;j<=locks.Rows;j++)
          {
          oXL.ActiveCell.Cells(j+2,i) = locks.GetColumnString(j,i);
          }
        } 
      }
    }
  if (SqlServerChoise.value == "ListMembers")    //к каким группам принадлежит текущий юзер
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)
      {
      var oServer = new ActiveXObject ("SQLDMO.SQLServer");     //создаем объект
      var memberslist="Роли пользователя на сервере\n--------------------------\n";
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true
        oServer.Connect(window.dbsource.value);
        }
      var members = oServer.ListMembers(3); //отображает права юзера на сервере и в базе данных 
      for (i=1;i<=members.Count;i++)
        {
        memberslist=memberslist+members.Item(i)+"\n";        
        } 
      window.resultat.innerText=memberslist;
      }
    }
  if (SqlServerChoise.value=="ScriptTablDB")  // отскриптовать таблицу или базу данных
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)                                    // если были введены имя сервера логин и пароль то
      {
      var oServer = new ActiveXObject ("SQLDMO.SQLServer");     //создаем объект
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true
        oServer.Connect(window.dbsource.value);
        }
      //спрашиваем имя базы данных или таблицы которую нужно отскриптовать, если имя таблицы не введено то считаем что нужно отскриптовать базу данных
      DBname=window.prompt("ВВЕДИТЕ ИМЯ БАЗЫ ДАННЫХ, ЕСЛИ ХОТИТЕ ПОЛУЧИТЬ СКРИПТ БАЗЫ, ТО НЕ ЗАПОЛНЯЙТЕ ОКНО С ИМЕНЕМ ТАБЛИЦЫ:","master"); 
      TableName = window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ:","");
      if (TableName!="")
        {
        var Target = oServer.Databases(DBname).Tables(TableName);
        }
      else
        {
        var Target = oServer.Databases(DBname);
        }
      window.resultat.innerText=Target.Script();
      }
    }  
  if (SqlServerChoise.value=="createuser")  // создать логин в базе данных
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)                                    // если были введены имя сервера логин и пароль то
      {
      var oServer = new ActiveXObject ("SQLDMO.SQLServer2");     //создаем объект
      var oLogin = new ActiveXObject ("SQLDMO.Login")
      var WshNetwork = new ActiveXObject("WScript.Network");
      var username=WshNetwork.ComputerName+"\\"+WshNetwork.UserName;
      if (window.winauth.checked == false)
        {
        oServer.Connect(window.dbsource.value,window.login.value,window.pass.value);    // подключаемся к серверу, sql аутентификация 
        }
      else
        {
        oServer.LoginSecure = true
        oServer.Connect(window.dbsource.value);     // либо windows аутентификация
        }
      oLogin.Name = window.prompt("ВВЕДИТЕ ЛОГИН (ФОРМАТЫ): 1.DomainName\\UserName(или GroupName) 2.CompName\\UserName(или GroupName) 3.UserName (SqlAuth)",username); //выводим окно с запросом имени пользователя
      oLogin.Type= window.prompt("ВВЕДИТЕ ТИП УЧЕТНОЙ ЗАПИСИ: 0-уч. запись пользователя windows 1-уч. запись группы windows 2-sql пользователь","0"); //выводим окно с запросом имени пользователя
      oServer.Logins.Add (oLogin);
      alert ("учетная запись создана!")
      }
    }
  function StoredProcedures (ProcedureName, output) // функция для запуска хранимой процедуры, с выводом либо в ексель либо на форму
    {
    checked=DataSourceChoise("sqlserver");
    if (checked==1)
      {
      var objConn = new ActiveXObject ("ADODB.Connection") ; 
      var objRecordset = new ActiveXObject ("ADODB.RecordSet");
      objConn.ConnectionString=DSNSqlserver;                   //строка подключения к источнику данных
      objConn.Open();
      objRecordset = objConn.Execute(ProcedureName);       // выполняем запрос (это может быть как имя процедуры так и sql запрос)
      // выводим результат либо в ексель либо на форму
      if (output == "excel")
        {
        var oXL = new ActiveXObject ("Excel.Application");
        oXL.Visible = true;
        oXL.Caption = ProcedureName;          
        oXL.WorkBooks.Add();
        for (i=0; i<objRecordset.Fields.count;i++)   // в цикле танго :)
          {
          oXL.ActiveCell.Cells(1,i+1).value=objRecordset.Fields.Item(i).Name;  // сначала заполняем первую строчку именами полей запроса
          }
        
        i=0;
        while (objRecordset.EOF != true)
          {
          i=i+1;
          for (j=1;j<=objRecordset.Fields.Count;j++)
            {
            oXL.ActiveCell.Cells(i+2,j).value=objRecordset.Fields.Item(j-1).value;
            }
          objRecordset.MoveNext();
          }
          
        oXL.Columns.AutoFit();  // автоподборка ширины столбцов
        }
      if (output=="native")
        {
        fields="";
        strdb = objRecordset.GetString;
        for (i=0; i<objRecordset.Fields.count;i++)   // в цикле записываем список полей в переменную fields
          {
          fields=fields+objRecordset.Fields.Item(i).Name+"\t";
          }
        window.resultat.innerText=fields+"\n------------------------------------------------\n"+strdb;
        }  
      objConn.Close();
      }
    }
  //функции для выполенения хранимых процедур
  if (SqlServerChoise.value=="sp_help")
    {
    StoredProcedures ("sp_help","excel");
    }
  if (SqlServerChoise.value=="sp_helpdb")
    {
    StoredProcedures ("sp_helpdb","excel");
    }
  if (SqlServerChoise.value=="version")
    {
    StoredProcedures ("select @@version","native");
    }
  if (SqlServerChoise.value=="sp_tables")
    {
    StoredProcedures ("sp_tables","excel");
    }
  if (SqlServerChoise.value=="InfSchemaTables")
    {
    StoredProcedures ("SELECT * FROM INFORMATION_SCHEMA.TABLES","excel");
    }
  if (SqlServerChoise.value=="InfSchemaViews")
    {
    StoredProcedures ("SELECT * FROM INFORMATION_SCHEMA.VIEWS","excel");
    }
  if (SqlServerChoise.value=="SysDatabaseFiles")
    {
    StoredProcedures ("select * from sys.database_files","excel");
    }
  if (SqlServerChoise.value=="SysBackup_devices")
    {
    StoredProcedures ("select * from sys.backup_devices","excel");
    }
  if (SqlServerChoise.value=="sys.filegroups")
    {
    StoredProcedures ("select * from sys.filegroups","excel");
    }
  if (SqlServerChoise.value=="sys.indexes")
    {
    StoredProcedures ("select * from sys.indexes","excel");
    }
  if (SqlServerChoise.value=="sys.foreign_keys")
    {
    StoredProcedures ("select * from sys.foreign_keys","excel");
    }
  if (SqlServerChoise.value=="sys.master_files")
    {
    StoredProcedures ("select * from sys.master_files","excel");
    }
  if (SqlServerChoise.value=="sys.remote_logins")
    {
    StoredProcedures ("select * from sys.remote_logins","excel");
    }
  if (SqlServerChoise.value=="sys.sql_logins")
    {
    StoredProcedures ("select * from sys.sql_logins","excel");
    }
  if (SqlServerChoise.value=="sys.syslogins")
    {
    StoredProcedures ("select * from sys.syslogins","excel");
    }
  if (SqlServerChoise.value=="sp_helpdevice")
    {
    StoredProcedures ("sp_helpdevice","excel");
    }
  if (SqlServerChoise.value=="sp_helplogins")
    {
    StoredProcedures ("sp_helplogins","excel");
    }
  if (SqlServerChoise.value=="sp_helpserver")
    {
    StoredProcedures ("sp_helpserver","excel");
    }
  if (SqlServerChoise.value=="sp_linkedservers")
    {
    StoredProcedures ("sp_linkedservers","excel");
    }
  if (SqlServerChoise.value=="sp_monitor")
    {
    StoredProcedures ("sp_monitor","excel");
    }
  if (SqlServerChoise.value=="sp_oledb_defdb")
    {
    StoredProcedures ("sp_oledb_defdb","excel");
    }
  if (SqlServerChoise.value=="sp_readerrorlog")
    {
    StoredProcedures ("sp_readerrorlog","excel");
    }
  if (SqlServerChoise.value=="sp_server_info")
    {
    StoredProcedures ("sp_server_info","excel");
    }
  if (SqlServerChoise.value=="sp_who")
    {
    StoredProcedures ("sp_who","excel");
    }
  if (SqlServerChoise.value=="sp_who2")
    {
    StoredProcedures ("sp_who2","excel");
    }
  if (SqlServerChoise.value=="sp_MSgetversion")
    {
    StoredProcedures ("sp_MSgetversion","excel");
    }
  }
    
function FindSource()  // функция заполняет выпадающий список dbsource списком odbc источников данных и sql серверов
  {
  if (flag!=1)   // по флагу будем определять делели ли мы уже запрос на поиск мс скуль серверов , если делали, то повторяться не будем
    {
    var arrindex=1;
    window.dbsource.clearAttributes();  // очищаем список селект с именем dbsource
    alert ("Выполняется поиск источников данных, программа \"зависнет\" на некоторое время");
    var oNewNode = document.createElement("option");  // создаем элемент для списка селект
    window.dbsource.appendChild(oNewNode);            // добавляем новый узел в dbsource
    oNewNode.innerHTML="---SQL сервера сети---";             // Текст элемента
    var oSQLApp = new ActiveXObject ("SQLDMO.Application")
    var Names = oSQLApp.ListAvailableSQLServers();  // список доступных мс скуль серверов
    for (i= 1; i<= Names.Count; i++)  // в цикле пишем все найденные сервера в список селект
      {
      var oNewNode = document.createElement("option");  // создаем элемент для списка селект
      window.dbsource.appendChild(oNewNode);            // добавляем новый узел в dbsource
      oNewNode.innerText=Names.Item(i); //добавляем очередной элемент
      oNewNode.value=Names.Item(i);
      sqlserverlistarr[i]=Names.Item(i);   // заполняем списком sql серверов сети, массив sqlserverlistarr
      }
    var oNewNode = document.createElement("option");  // создаем элемент для списка селект
    window.dbsource.appendChild(oNewNode);            // добавляем новый узел в dbsource
    oNewNode.innerHTML="---ODBC источники данных---";             // Текст элемента
    //повторяюсь - функция сперта откуда-то из инэта, поэтому комментов мало, да и лень мне выписывать  
    sRegPath = "Software\\ODBC\\ODBC.INI";
    oLoc = new ActiveXObject("WbemScripting.SWbemLocator");
    oSvc = oLoc.ConnectServer(null, "root\\default");
    oReg = oSvc.Get("StdRegProv");
    oMethod = oReg.Methods_.Item("EnumKey");
    oInParam = oMethod.InParameters.SpawnInstance_();
    oInParam.hDefKey = '&H80000002'; // HKLM
    oInParam.sSubKeyName = sRegPath;
    oOutParam = oReg.ExecMethod_(oMethod.Name, oInParam);
    aNames = oOutParam.sNames.toArray();
    for (i = 0; i < aNames.length; i++)
    {
    oMethod = oReg.Methods_.Item("GetStringValue");
    oInParam = oMethod.InParameters.SpawnInstance_();
    oInParam.hDefKey = '&H80000002';
    oInParam.sSubKeyName = sRegPath;
    oInParam.sValueName = aNames[i];
    oOutParam = oReg.ExecMethod_(oMethod.Name, oInParam);
    if ((aNames[i]!="ODBC Data Sources") & (aNames[i]!="ODBC File DSN") )
      {
      var oNewNode = document.createElement("option");  // создаем элемент для списка селект
      window.dbsource.appendChild(oNewNode);            // добавляем новый узел в dbsource
      oNewNode.innerText=aNames[i];
      oNewNode.value=aNames[i];
      odbclistarr[arrindex]=aNames[i]; //  // заполняем списком источников данных, массив sqlserverlistarr
      arrindex=arrindex+1;      // отдельная переменная для заполнения массива, чтобы в него не добавились две undefined ячейки, которые получаются в результате исключения строк "ODBC Data Sources" и "ODBC File DSN" из списка источников данных 
      }
    }
  }
  if (flag!=1)
    {
    alert ("Поиск источников данных выполнен, \nтеперь вы можете просмотреть полученные результаты, нажав на выпадающий список - \"Выберите источник данных\"");
    }
    flag=1;  // по флагу будем определять делали ли мы уже запрос на поиск мс скуль серверов в сети, если делали, то повторяться не будем, потому что долго он их ищет
  }
                  
function mysql()        // функция для работы с Mysql сервером
  {
  function MySqlQuery (QueryStr, output) // функция для запуска хранимой процедуры, с выводом либо в ексель либо на форму
    {
    checked=DataSourceChoise("odbc");
    if (checked==1)
      {
      var objConn = new ActiveXObject ("ADODB.Connection") ; 
      var objRecordset = new ActiveXObject ("ADODB.RecordSet");
      objConn.ConnectionString=DSNSqlserver;                   //строка подключения к источнику данных
      fields="";
      objConn.Open();
      objRecordset = objConn.Execute(QueryStr);       // выполняем запрос
      // выводим результат либо в ексель либо на форму
      if (output == "excel")
        {
        var oXL = new ActiveXObject ("Excel.Application");
        oXL.Visible = true;
        oXL.Caption = QueryStr;          
        oXL.WorkBooks.Add();
        for (i=0; i<objRecordset.Fields.count;i++)   // в цикле танго :)
          {
          oXL.ActiveCell.Cells(1,i+1).value=objRecordset.Fields.Item(i).Name;  // сначала заполняем первую строчку именами полей запроса
          }

        i=0;
        while (objRecordset.EOF != true)
          {
          i=i+1;
          for (j=1;j<=objRecordset.Fields.Count;j++)
            {
            oXL.ActiveCell.Cells(i+2,j).value=objRecordset.Fields.Item(j-1).value;
            }
          objRecordset.MoveNext();
          }
        }
      oXL.Columns.AutoFit();  // автоподборка ширины столбцов
      if (output=="native")
        {
        fields="";
        strdb = objRecordset.GetString;
        for (i=0; i<objRecordset.Fields.count;i++)   // в цикле записываем список полей в переменную fields
          {
          fields=fields+objRecordset.Fields.Item(i).Name+"\t";
          }
        window.resultat.innerText=fields+"\n------------------------------------------------\n"+strdb;
        }  
      objConn.Close();
      }
    }
  
  if (mysqlchoise.value == "showdatabases")
    {
      MySqlQuery ("show databases","native");
    }
  if (mysqlchoise.value == "showtables")   // список таблиц текущей базы данных
    {
      MySqlQuery ("show tables","native");
    }
  if (mysqlchoise.value == "showfields")    //список полей таблицы базы данных
    {
      tablename=window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ, ОПИСАНИЕ КОТОРОЙ НЕОБХОДИМО ПОЛУЧИТЬ","user"); //выводим окно с запросом имени таблицы
      MySqlQuery("describe "+tablename,"native");
    }
  if (mysqlchoise.value == "processlist")        // список выполняющихся в данный момент запросов от клиентов к mysql серверу
    {
      MySqlQuery( "SHOW PROCESSLIST","native");
      if (interval == "")
      {
      interval=window.prompt("ЗАДАЙТЕ ИНТЕРВАЛ ОБНОВЛЕНИЯ В СЕКУНДАХ",10); //выводим окно с запросом имени таблицы
      timerID = setTimeout("mysql()",interval*1000);
      }
    else
      {
      timerID = setTimeout("mysql()",interval*1000);
      }
    }
  if (mysqlchoise.value == "showversion")   // версия сервера и имя текущего пользователя
    {
      vers=MySqlQuery ("select version()","native");
    }
  if (mysqlchoise.value == "curruser")
    {  
    MySqlQuery ("select user()","native");
    }
  if (mysqlchoise.value == "tablesstatus")        // информация о всех таблицах базы данных
    {
      dbname=window.prompt("ВВЕДИТЕ ИМЯ БАЗЫ ДАННЫХ ИНФОРМАЦИЮ О ТАБЛИЦАХ КОТОРОЙ НЕОБХОДИМО ПОЛУЧИТЬ","mysql"); //выводим окно с запросом имени таблицы
      MySqlQuery ("SHOW TABLE STATUS FROM "+dbname,"excel");
    }
  if (mysqlchoise.value == "showcreatetable")   // системные переменные my sql сервера
    {
      tablename=window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ, ОПИСАНИЕ КОТОРОЙ НЕОБХОДИМО ПОЛУЧИТЬ В ФОРМАТЕ ЗАПРОСА SQL","user"); //выводим окно с запросом имени таблицы
      MySqlQuery("show create table "+tablename,"native");
      }
  if (mysqlchoise.value == "showvariables")   // системные переменные сервера
    {
      MySqlQuery("show variables","native")
    }
  if (mysqlchoise.value == "showstatus")   // статус (статистика сервера)
    {
      MySqlQuery ("show status", "native");
      }
  if (mysqlchoise.value == "checktable")    //проверка таблицы
    {
      tablename=window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ, КОТОРУЮ НЕОБХОДИМО ПРОВЕРИТЬ НА НАЛИЧИЕ ОШИБОК","user"); //выводим окно с запросом имени таблицы
      MySqlQuery ("check table "+tablename,"native");
    }
  if (mysqlchoise.value == "optimizetable")    //оптимизация таблицы
    {
      tablename=window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ, КОТОРУЮ НЕОБХОДИМО ОПТИМИЗИРОВАТЬ","user"); //выводим окно с запросом имени таблицы
      MySqlQuery ("optimize table "+tablename,"native");
    }
  if (mysqlchoise.value == "repairtable")    //восстановление битой таблицы
    {
      tablename=window.prompt("ВВЕДИТЕ ИМЯ ТАБЛИЦЫ, КОТОРУЮ НЕОБХОДИМО ОПТИМИЗИРОВАТЬ","user"); //выводим окно с запросом имени таблицы
      MySqlQuery("repair table "+tablename,"native");
    }
  }

function ExecQuery(typequery)     // выполнить запрос к базе данных
  {
  if (window.sqlqery.value !=="")
    {
    checked=DataSourceChoise("all");  // нам можно использовать и источники данных и список sql серверов сети
    if (checked==1) 
      {
      var objConn = new ActiveXObject ("ADODB.Connection") ;
      if (DSNSqlserver != "")
        {
        objConn.ConnectionString=DSNSqlserver;
        }
      else
        {
        objConn.ConnectionString=window.dbsource.value;
        }
      window.resultat.innerText=" ";                                // очищаем поле с результатом выполненных команд
      strdb="";
      QueryStr=window.sqlqery.value;              // запрос к базе данных
      objConn.Open();
      objRecordset = objConn.Execute(QueryStr);  //выполнить запрос
      
      if (typequery=="excel")  // сработает если будет нажата кнопка - "Выполнить запрос (Excel)"
        {
        var oXL = new ActiveXObject ("Excel.Application");
        oXL.Visible = true;          
        oXL.Caption=QueryStr;
        oXL.WorkBooks.Add();
        for (i=0; i<objRecordset.Fields.count;i++)   // в цикле танго :)
          {
          oXL.ActiveCell.Cells(1,i+1).value=objRecordset.Fields.Item(i).Name;  // сначала заполняем первую строчку именами полей запроса
          }
        i=0;
        while (objRecordset.EOF != true)
          {
          i=i+1;
          for (j=1;j<=objRecordset.Fields.Count;j++)
            {
            oXL.ActiveCell.Cells(i+2,j).value=objRecordset.Fields.Item(j-1).value;
            }
          objRecordset.MoveNext();
          }
        oXL.Columns.AutoFit();  // автоподборка ширины столбцов
        }
    
    if (typequery=="native")  // данные запроса будут возращены в текстовое поле на форме
      {
      fields="";
      //strdb = objRecordset.GetString;
      for (i=0; i<objRecordset.Fields.count;i++)   // в цикле записываем список полей в переменную fields
        {
        fields=fields+objRecordset.Fields.Item(i).Name+"\t";
        }
        window.resultat.innerText=fields+"\n------------------------------------------------\n"
        values="\n";
        i=0;
        while (objRecordset.EOF != true)
          {
          i=i+1;
          for (j=1;j<=objRecordset.Fields.Count;j++)
            {
            values=values+objRecordset.Fields.Item(j-1).value+"\t";
            }
          objRecordset.MoveNext();
          values=values+"\n";
          }
          window.resultat.innerText=window.resultat.innerText+values;
        
         
      }
    objConn.Close(); 
    }
  }
  else
    {
    alert ("Вы не ввели запрос!");
    }
  }
  

function notes() //функция добавляющая заметку в конец этого файла, заметки хранятся в текущем файле
  {
  // функция запроса добавления заметки ()
  function requestaddnote()
  {
  addnote=window.confirm("Добавить заметку? Если нужно просмотреть заметки нажмите ОТМЕНА!");
  if (addnote==true)
    {
    NoteText = window.prompt("Введите текст заметки", "текст_заметки"); 
    if (NoteText == "")
      {
      alert ("Вы ничего не ввели!");
      }
    else
      {
      AddNotes (NoteText) // запись заметки в файл
      }
    }
  else
    {
    ReadAllNotes ();               //чтение заметок из файла
    }
  }


// чтение заметок из файла
function ReadAllNotes ()
  {
  var fso= new ActiveXObject ("Scripting.FileSystemObject");  // создать объект FSO
  var itog="";
  UrlPath=window.location.pathname;
  //FileNamePath=UrlPath.replace(/\\/g,"\\\\");
  FileNamePath=UrlPath.replace(/%20/g," ");
  txt=fso.OpenTextFile(FileNamePath,1,false);                   // открыть файл для чтения
  for (i=1;i<900;i++) 
    {
    txt.SkipLine()                                                   // пропускаем бОльшую часть файла чтобы лишнюю нагрузку на комп не создавать, не сравнивать бесполезные строки
    }
  while (txt.AtEndOfStream != true)                    // пока не достигнут конец файла,
    {
    Kol_voStrok=txt.Line;                                    // s= номер текущей строки открытого файла
    CurrentStroka = txt.ReadLine();                         // прочитать строку (то есть перейти к следующей строке)
    // если в текущей строке найдена нужная подстрока, то читаем все логины в файле
    if (CurrentStroka == "<!--notes-->")          
      {
      while (txt.AtEndOfStream != true)
        {
        StrokaPoiska = txt.ReadLine(); 
        StrokaPoiska=StrokaPoiska.replace(/<!--/g," ");
        StrokaPoiska=StrokaPoiska.replace(/-->/g," ")
        itog=itog+StrokaPoiska+"\n";
        }
      }   
    }
  txt.Close();
  if (itog == "")
    {
    alert ("Заметок нет");
    }
    window.resultat.innerText=itog;  
  }

//добавление заметок в файл  
function AddNotes (passline)
  {
  var fso= new ActiveXObject ("Scripting.FileSystemObject");  // создать объект FSO
  var UrlPath=window.location.pathname;
  FileNamePath=UrlPath.replace(/%20/g," ");
  txt=fso.OpenTextFile(FileNamePath, 8, false);
  txt.WriteLine("<!--"+passline+"-->");
  txt.Close();
  }
//AddPass();



  requestaddnote();
  }

function openWin(winname)  //функция запуска программы
  {
  var wsh=new ActiveXObject("WScript.Shell");
  wsh.Run(winname,1);  
  }
    
-->
</SCRIPT>
</HEAD>

<BODY lang=RU bgColor=silver onload='resize()'>
<H4 align=center>SQL Toolz 
<HR align=center width="95%" SIZE=5>

<TABLE width="95%" border=0>
  <TBODY>
  <TR>
    <TD align=left>
    <center><select id=dbsource onclick=FindSource() name=dbsource>
    <option value=FindSource selected>&nbsp;Выберите ИСТОЧНИК ДАННЫХ&nbsp;</option>
    </select></center>
    </TD>
    <TD align=right>Логин: <input id=login type=text size=10 name=login> Пароль: <input id=pass type=password size=10 name=pass> Имя базы данных:<input id=databasename type=text size=10 value=master name=databasename>WinAuth:<input type=checkbox name=winauth id=winauth value=winauth > 
    </TD>
  </TR>
  </TBODY>
</TABLE>

<HR align=center width="95%">

<p></p>

<TABLE cellSpacing=0 cellPadding=0 width="95%" border=0>
  <TBODY>
  <TR>
    <TD>
      <P align=left><select id=raznoechoise>
      <option selected >РАЗНОЕ</option>
      <option value=odbc>--- --- ---</option>
      <option value=odbc>Список источников данных ODBC</option>
      <option value=createmdb>Создать базу данных .MDB</option> 
      <option value=listtables>Cписок таблиц Источника данных</option>
      </select>
      <input id=tools onclick=raznoe() type=button value=ок name=raznoebutton> 
      </P>
    </TD>
    <TD>
      <P align=left><select id=SqlServerChoise> 
      <option value=odbc selected >MS SQL Server</option> 
      <option >--- ИНФОРМАЦИЯ ---</option> 
      <option value=sqlserverslist>Список MsSql серверов в сети</option> 
      <option value=ServerProperty >Список свойств Sql сервера</option> 
      <option value=adSchemaCatalogs>Список баз данных сервера</option> 
      <option value=EnumProcesses>Список процессов сервера</option> 
      <option value=EnumLocks>Список блокировок сервера</option> 
      <option value=ListMembers>Роли пользователя</option> 
      <option value=version>Версия Sql сервера</option> 
      <option value=ScriptTablDB>Отскриптовать таблицу или базу</option> 
      <option>--- ФУНКЦИИ ---</option>
      <option value=createuser>Создать юзера</option> 
      <option>--- ХРАНИМЫЕ ПРОЦЕДУРЫ ---</option>
      <option value=sp_help>sp_help</option> 
      <option value=sp_helpdb>sp_helpdb</option> 
      <option value=sp_tables>sp_tables</option> 
      <option value=sp_helpdevice>sp_helpdevice</option> 
      <option value=sp_helplogins>sp_helplogins</option> 
      <option value=sp_helpserver>sp_helpserver</option> 
      <option value=sp_linkedservers>sp_linkedservers</option> 
      <option value=sp_monitor>sp_monitor</option> 
      <option value=sp_oledb_defdb>sp_oledb_defdb</option> 
      <option value=sp_readerrorlog>sp_readerrorlog</option> 
      <option value=sp_server_info>sp_server_info</option> 
      <option value=sp_who>sp_who</option> 
      <option value=sp_who2>sp_who2</option> 
      <option value=sp_MSgetversion>sp_MSgetversion</option> 
      <option>--- БАЗА ДАННЫХ ---</option>
      <option value=InfSchemaTables>Таблицы пользователя</option> 
      <option value=InfSchemaViews>Представления пользователя</option> 
      <option value=SysDatabaseFiles>Файлы Базы Данных</option> 
      <option value=SysBackup_devices>Backup_devices</option> 
      <option value=sys.filegroups>Группы файлов</option> 
      <option value=sys.master_files>Master_files</option> 
      <option value=sys.foreign_keys>Первичные ключи</option>
      <option value=sys.indexes>Индексы</option>
      <option value=sys.remote_logins>Remote_logins </option>
      <option value=sys.sql_logins>Sql_logins </option>
      <option value=sys.syslogins>SysLogins </option>
      </select>
      <input id=SqlDmoButton onclick=SqlServer() type=button value=ок> 
      </P>
    </TD>
    <TD>
      <P align=center><select id=mysqlchoise> 
      <option selected>MY SQL</option> 
      <option>--- ИНФОРМАЦИЯ ---</option> 
      <option value=showdatabases>Список баз данных</option> 
      <option value=showtables>Список таблиц базы данных</option> 
      <option value=showfields >Описание выбранной таблицы</option> 
      <option value=tablesstatus>Информация о всех таблицах БД</option> 
      <option value=processlist>Cписок выполняющихся запросов</option> 
      <option value=showversion>Версия сервера</option> 
      <option value=curruser>Уч. запись пользователя</option> 
      <option value=showvariables>Системные переменные сервера</option> 
      <option value=showstatus>Статус (статистика) сервера</option> 
      <option value=showcreatetable>Отскриптовать таблицу</option> 
      <option>--- ФУНКЦИИ ---</option>
      <option value=checktable>Проверить таблицу</option> 
      <option value=optimizetable>Оптимизировать таблицу</option> 
      <option value=repairtable>Ремонт таблицы</option>
      </select> 
      <input id=Button2 onclick=mysql() type=button value=ок name=mysql> 
      </P>
    </TD>
  </TR>
  </TBODY>
</TABLE>

<p></p>
<center></center>

<TABLE width="95%" align=center border=1>
  <TBODY>
  <TR>
    <TD>
      <CENTER> <p>Выполнить SQL запрос</p></CENTER>
    </TD>
    <TD align=middle>Результат</TD>
  </TR>
  <TR>
    <TD vAlign=top>
      <center><textarea id=sqlqery name=sqlqery rows=10 cols=35></textarea> </center>
      <p><center><input id=SendQuery onclick='ExecQuery("native")' type=button value="Выполнить запроc" name=SendQuery></center></p>
      <hr width=95%>
      <center>Выполнить запрос вернув данные в Excel (для более удобной работы с данными)<p><input id=Button3 onclick='ExecQuery("excel")' type=button value="Выполнить запроc (Excel)" name=SendQuery></p></center>
    </TD>
    <TD> 
      <center><textarea id=resultat name=resultat rows=25 cols=79></textarea></center>
    </TD>
  </TR>
  </TBODY>
</TABLE>

<p></p>

<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD>
      <P align=center><INPUT id=note type=button value='Заметки' onclick='notes()'></P></TD>
    <TD>
      <P align=center><INPUT id=Button1 onclick='openWin("%SystemRoot%\\system32\\odbcad32.exe")' type=button value='Источники данных'></P></TD>
    <TD>
      <P align=center><INPUT id=Button13 onclick='openWin("Notepad")' type=button value=Notepad></P></TD>
    <TD>
      <P align=center><INPUT id=Button16 onclick='openWin("Cmd")' type=button value="     Cmd     "></P></TD>
    <TD>
      <P align=center><INPUT id=Button17 onclick='openWin("Msconfig")' type=button value=Msconfig></P></TD>
    <TD>
      <P align=center><INPUT id=Button18 onclick='openWin("taskmgr")' type=button value=TaskMgr></P></TD>
    <TD>
      <P align=center><INPUT id=Button15 onclick='openWin("regedit")' type=button value="Regedit"></P></TD>
    <TD> <P align=center>&nbsp;&nbsp; </P></TD>
  </TR>
  </TBODY>
</TABLE>

<HR align=center width="95%">
</BODY>
</HTML>
<!--В следующих строках хранятся заметки, поэтому не удаляйте строку с текстом notes, остальные строки на ваше усмотрение-->
<!--notes-->
<!--Все существующие на MS SQLсервере Учетные записи   -  select * from master..syslogins-->

Автор - null.

MoonRabbit Update:
Утилита требует установки клиента SQL Server Distributed Management Objects (SQL-DMO).
Данный клиент ставиться или с основными утилитами SQL Server, или отдельно:
INF: Enabling SQL DMO Clients Without Installing the Client Side Utilities

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.