Pull to refresh

Comments 11

Ну как говориться… «Вот так, с помощью нехитрых приспособлений буханку белого (или черного) хлеба можно превратить в троллейбус… но зачем?»
Те вариант с командной строкой гораздо проще.
Строго говоря, «варианта с командной строкой» вообще не было. Скрипт останавливает сервис, переводит его в однопользовательский режим, запускает сервис, добавляет текущего юзера в админы, останавливает сервис, восстанавливает многопользовательский режим и перезапускает сервис. В описании ручного добавления только добавление юзера в админы было проведено из командной строки.
Пара замечаний:

На powershell скрипт будет выглядеть не «аналогично», а раз эдак в 5-10 короче.

Багрепорт:
function OpenSqlWmiNamespace(instance) {
  var wmi = LookupInstanceContext(instance, "ComputerManagement10");
  if (wmi != null) {
    return wmi;
  }
  var wmi = LookupInstanceContext(instance, "ComputerManagement10");
  if (wmi != null) {
    return wmi;
  }


  throw new Error("Instance '" + instance + "' not found.");
}


Насколько я понимаю, скрипт оба раза пытается работать с одной и той же версией неймспейса. Кроме того, в mssql 2012 имя неймспейса ComputerManagement11. В принципе можно просто перечислить все объекты класса __NAMESPACE в неймспейсе \\root\Microsoft\SqlServer и выбрать подходящий ComputerManagement*
Отличная идея, и как я не додумался! Щас переделаю и залью на github. Как говорится, дубликация — источник багов. Что же касается PowerShell, согласен, что на нем лаконичнее, но, к сожалению, его нет на 2003-м сервере по умолчанию, а такие зверушки все еще водятся в нашем зоопарке.
Стало так:
function EnumerateSqlNamespaces() {
  var wmi = GetObject("WINMGMTS:\\\\.\\root\\Microsoft\\SqlServer");
  return new Enumerator(wmi.ExecQuery("SELECT * FROM __NAMESPACE WHERE Name LIKE 'ComputerManagement%'"));
}

function OpenSqlWmiNamespace(instance) {
  var namespaces = EnumerateSqlNamespaces();
  for (; !namespaces.atEnd(); namespaces.moveNext()) {
    var namespace = namespaces.item();
    var wmi = LookupInstanceContext(instance, namespace.Name);
    if (wmi != null) {
      return wmi;
    }
  }

  throw new Error("Instance '" + instance + "' not found.");
}
[offtopic]
Скажите спасибо что не batch. Помню видел, как его использовали в не самом легаси проекте, на 2008 сервере… И в универе, помнится, для автоматизации процессов на винде предлагался именно он.
[/offtopic]
Е-мае, как страшно жить…

Чем вам не нравится такой вариант?

net stop MSSQLSERVER
net start MSSQLSERVER /m
osql -E -S .\InstanceName -Q "EXEC sp_addsrvrolemember 'DOM\User', 'sysadmin'"
net stop MSSQLSERVER
net start MSSQLSERVER


мануалов на эту тему — куча, вырезал из этого: kaktusenok.blogspot.ru/2011/09/microsoft-sql-server-2008-2005.html
Мда, ваш вариант настолько прост, что даже как-то хочется от стыда статью удалить. Я не знал, что можно инкрементально сервису параметры доставлять через net start — спасибо!
Хотя, суть статьи — это иллюстрация работы с WMI из скриптов на конкретном примере. Есть примеры, когда командной строки недостаточно. Например, TCP протокол вроде через командную строку не включишь. Собственно, именно этот свой скрипт я и переделал для этой статьи.
Иллюстрация удалась, так что статья, конечно, полезная.
А использование сложных, но знакомых механизмов вместо простых, но незнакомых достаточно часто случается — объем знаний у каждого разный, и мы все идем по пути наименьшего сопротивления.
Не надо статью удалять. Описание wbemtest имеет самостоятельную ценность, безотносительно к MS SQL Server
ну собственно это то о чем я и говорил…
Sign up to leave a comment.

Articles