SQL 2005 Database Set State

Microsoft.SQLServer.2005.SetDBState (WriteActionModuleType)

This module type is used to change the state of Microsoft SQL Server 2005 Database. It takes configuration regarding the database to alter and the state to set.

Element properties:

TypeWriteActionModuleType
IsolationAny
AccessibilityInternal
RunAsMicrosoft.SQLServer.SQLDefaultAccount
InputTypeSystem.BaseData

Member Modules:

ID Module Type TypeId RunAs 
WA WriteAction Microsoft.Windows.ScriptWriteAction Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
TimeoutSecondsint$Config/TimeoutSeconds$Timeout (sec)

Source Code:

<WriteActionModuleType ID="Microsoft.SQLServer.2005.SetDBState" Accessibility="Internal" RunAs="SQL!Microsoft.SQLServer.SQLDefaultAccount">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="ConnectionString" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Database" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="State" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:int"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="TimeoutSeconds" ParameterType="int" Selector="$Config/TimeoutSeconds$"/>
</OverrideableParameters>
<ModuleImplementation>
<Composite>
<MemberModules>
<WriteAction ID="WA" TypeID="Windows!Microsoft.Windows.ScriptWriteAction">
<ScriptName>SetSQL2005DBState.js</ScriptName>
<Arguments>"$Config/ConnectionString$" "$Target/Host/Property[Type="SQL!Microsoft.SQLServer.DBEngine"]/TcpPort$" "$Config/Database$" "$Config/State$" "$Target/Host/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$" "$Target/Host/Property[Type="SQL!Microsoft.SQLServer.ServerRole"]/InstanceName$"</Arguments>
<ScriptBody><Script>//#Include File:SQL2005Constants.js

var SQL_WMI_NAMESPACE = "ComputerManagement";

var MANAGEMENT_PACK_VERSION = "6.7.2.0";

//#Include File:Common.js

var DEBUG = false;
var ManagementGroupName = "$Target/ManagementGroup/Name$";
var ManagementGroupID = "$Target/ManagementGroup/Id$";

Function.prototype.setAlias = function (name) {
this.getAlias = function () {
return name;
};
};

Array.prototype.indexOf = function(item) {
for (var i = 0; i &lt; this.length; i++) {
if (this[i] === item) {
return i;
}
}
return -1;
};

Array.prototype.intersectsWith = function(arrB) {
for (var i = 0; i &lt; this.length; i++) {
for (var j = 0; j &lt; arrB.length; j++) {
if (this[i] === arrB[j]) {
return true;
}
}
}
return false;
};

if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}

function EscapeConnStringValue(connStringValue) {
return '{' + connStringValue.replace(/}/g, '}}') + '}';
};

function EscapeWQLString(wqlString) {
return wqlString.replace(/'/g, "\\'");
}

function DelimitSqlIdentifier(identifier) {
return "[" + identifier.replace(/\]/g, "]]") + "]";
}

Error.prototype.toString = function () {
if (this.message) {
var parts = [];
parts.push(this.message);
parts.push('\n');

if (this.number) {
parts.push("Error Number : ");
parts.push(this.number);
parts.push('\n');
parts.push("Error Code : ");
parts.push(this.number &amp; 0xFFFF);
parts.push('\n');
parts.push("Win32 Facility : ");
parts.push((this.number &gt;&gt; 16 &amp; 0x1FFF));
parts.push('\n');
}
if (this.description) {
parts.push("Error Description : ");
parts.push(this.description);
}
parts.push('\n');
return parts.join('');
}
else {
return this.toString();
}
};

var Exception = function (message, innerException) {
arguments.callee.setAlias('Exception.constructor');
this.message = message;
this.innerException = innerException;

var parts = [];
var collectArguments = function (caller) {
parts.push('(');
for (var i = 0; i &lt; caller.length; i++) {
if (typeof (caller[i]) != 'undefined') {
parts.push(caller[i] === null ? 'null' : (typeof (caller[i].toString) === 'undefined' ? 'object' : caller[i].toString()));
parts.push(',');
}
}
parts.pop();
parts.push(')');
parts.push(',\n');
};
var collectCallStack = function (caller) {
arguments.callee.setAlias('Exception.collectCallStack');
parts.push(caller.callee.getAlias ? caller.callee.getAlias() : 'anonymous');
collectArguments(caller);
var nextCaller = caller.caller;
if (nextCaller)
collectCallStack(nextCaller);
};
collectCallStack(arguments);
this.callStack = parts.join('');

this.toString = function () {
arguments.callee.setAlias('Exception.toStringFull');
var strParts = [];
strParts.push(this.message);
strParts.push('\n');
if (this.innerException) {

strParts.push('Inner exception: \n');
strParts.push("Error Number : ");
strParts.push(this.innerException.number);
strParts.push('\n');
strParts.push("Error Code : ");
strParts.push(this.innerException.number &amp; 0xFFFF);
strParts.push('\n');
strParts.push("Win32 Facility : ");
strParts.push((this.innerException.number &gt;&gt; 16 &amp; 0x1FFF));
strParts.push('\n');
strParts.push("Error Description : ");
strParts.push(this.innerException.description);
strParts.push('\n');
}
strParts.push('Call stack:');
strParts.push(this.callStack);
return strParts.join('');
};
};

var OpsMgrAPI = function () {
arguments.callee.setAlias('MOMAPI.constructor');
var scriptAPI;
try {
scriptAPI = new ActiveXObject('MOM.ScriptAPI');
}
catch (e) {
throw new Exception("Application cannot create MOM.ScriptAPI ActiveX object.", e);
}
this.ScriptAPI = scriptAPI;
};
var MessageType = {
Error: 1,
Warning: 2,
Information: 4
};
var Logger = function () {
arguments.callee.setAlias('Logger.constructor');
var opsMgrAPI = new OpsMgrAPI();

this.LogError = function (eventId, message) {
arguments.callee.setAlias('Logger.LogError');
opsMgrAPI.ScriptAPI.LogScriptEvent("Management Group: " + ManagementGroupName + ". Script: " + WScript.ScriptName + ". Version: " + MANAGEMENT_PACK_VERSION, eventId, MessageType.Error, message);
};
this.LogError2 = function (instanceName, eventId, message) {
arguments.callee.setAlias('Logger.LogError2');
opsMgrAPI.ScriptAPI.LogScriptEvent("Management Group: " + ManagementGroupName + ". Script: " + WScript.ScriptName + ". Version: " + MANAGEMENT_PACK_VERSION + ". Instance: " + instanceName, eventId, MessageType.Error, message);
};
this.LogWarning = function (eventId, message) {
arguments.callee.setAlias('Logger.LogWarning');
opsMgrAPI.ScriptAPI.LogScriptEvent("Management Group: " + ManagementGroupName + ". Script: " + WScript.ScriptName + ". Version: " + MANAGEMENT_PACK_VERSION, eventId, MessageType.Warning, message);
};
this.LogInformation = function (eventId, message) {
arguments.callee.setAlias('Logger.LogInformation');
opsMgrAPI.ScriptAPI.LogScriptEvent("Management Group: " + ManagementGroupName + ". Script: " + WScript.ScriptName + ". Version: " + MANAGEMENT_PACK_VERSION, eventId, MessageType.Information, message);
};
this.LogDebug = function (eventId, message) {
if (DEBUG) {
arguments.callee.setAlias('Logger.LogDebug');
opsMgrAPI.ScriptAPI.LogScriptEvent("Management Group: " + ManagementGroupName + ". Script: " + WScript.ScriptName + ". Version: " + MANAGEMENT_PACK_VERSION, eventId, MessageType.Information, message);
}
};
this.LogCustomInfo = function (param1, eventId, message) {
arguments.callee.setAlias('Logger.LogCustomInfo');
opsMgrAPI.ScriptAPI.LogScriptEvent(param1, eventId, MessageType.Information, message);
};
};

var ADODB = function (connectionString, provider, connectionTimeout) {
arguments.callee.setAlias('ADODB.constructor');
if (!connectionString)
throw new Exception("Connection string cannot be null or empty string");

this.connectionTimeout = connectionTimeout ? connectionTimeout : 30;

var connection;
try {
connection = new ActiveXObject("ADODB.Connection");
}
catch (e) {
throw new Exception("Can't create ActiveXObject 'ADODB.Connection'", e);
}

if (provider) {
connection.Provider = provider;
}

connection.ConnectionTimeout = this.connectionTimeout;
connection.ConnectionString = connectionString;

this.provider = connection.Provider;

try {
connection.Open();
}
catch (e) {
throw new Exception("Can't connect to SQL Server. Connection string : '" + connectionString + "'. Error description: " + e.message, e);
}

this.ExecuteQuery = function (query) {
arguments.callee.setAlias('ADODB.ExecuteQuery');
var dbSet;
try {
dbSet = connection.Execute(query);
}
catch (e) {
throw new Exception("Can't execute query '" + query + "': " + e.message, e);
}
return dbSet;
};

this.ExecuteQueryWithParams = function (query) {
arguments.callee.setAlias('ADODB.ExecuteQueryWithParams');
if (arguments.length &lt;= 1) {
throw new Exception("Can't go without any params");
}
var dbSet;
try {
var command = new ActiveXObject("ADODB.Command");
command.ActiveConnection = connection;
command.CommandText = query;
command.CommandType = 1; // adCmdText
for (var i = 1; i &lt; arguments.length; i++) {
this.AddParam(command, arguments[i]);
}
dbSet = command.Execute();
} catch (e) {
throw new Exception("Can't execute query '" + query + "': " + e.message, e);
}
return dbSet;
};

this.AddParam = function (cmd, value) {
var parameter;
switch (typeof value) {
case "number":
parameter = cmd.CreateParameter("", 20, 1, 8, value); // , adBigInt, adParamInput
break;
case "string":
parameter = cmd.CreateParameter("", 202, 1, Math.max(value.length, 1), value); // , adVarWChar, adParamInput
break;
default:
throw new Exception("Unknown parameter type: " + typeof value);
}
cmd.Parameters.Append(parameter);
};

this.Close = function () {
arguments.callee.setAlias('ADODB.Close');
try {
if (connection) {
connection.Close();
}
}
catch (e) {
throw new Exception("Can't close connection.", e);
}
};
};

var Registry = function () {
arguments.callee.setAlias('Registry.constructor');
var registry;
try {
registry = new ActiveXObject("WScript.Shell");
}
catch (e) {
throw new Exception("Can't create ActiveXObject 'WScript.Shell'", e);
}

this.Write = function (key, value, type) {
arguments.callee.setAlias('Registry.Write');
try {
if (type) {
registry.RegWrite(key, value, type);
}
else {
registry.RegWrite(key, value);
}
}
catch (e) {
throw new Exception("Can't write value '" + value.toString() + "' by registry key '" + key.toString() + "'.", e);
}
};
this.Read = function (key) {
arguments.callee.setAlias('Registry.Read');
var value;
try {
value = registry.RegRead(key);
}
catch (e) {
throw new Exception("Can't read value from registry key '" + key.toString() + "'.", e);
}
return value;
};
this.IsKeyExists = function (key) {
arguments.callee.setAlias('Registry.IsKeyExists');
var result = false;
try {
var value = registry.RegRead(key);
result = true;
}
catch (e) {
result = false;
}
return result;
};
this.Delete = function (key) {
arguments.callee.setAlias('Registry.Delete');
var value;
try {
value = registry.RegDelete(key);
}
catch (e) {
throw new Exception("Can't delete registry key '" + key.toString() + "'.", e);
}
return value;
};
};

var WMIProvider = function (wmiNamespace, computerName) {
arguments.callee.setAlias('WMIProvider.constructor');
this.wmiNamespace = wmiNamespace;
this.computerName = (!computerName) ? computerName : ".";
var SWbemLocator;
try {
SWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
}
catch (e) {
throw new Exception("Cannot create 'WbemScripting.SWbemLocator' object.", e);
}
this.SWbemLocator = SWbemLocator;

var wmiService;
try {
wmiService = this.SWbemLocator.ConnectServer(this.computerName, this.wmiNamespace);
}
catch (e) {
throw new Exception("Cannot connect to WMI of computer '" + this.computerName + "' by namespace '" + this.wmiNamespace + "'.", e);
}
this.WMIService = wmiService;

this.ExecQuery = function (query) {
arguments.callee.setAlias('WMIProvider.ExecQuery');
var result = null;
try {
result = this.WMIService.ExecQuery(query, "WQL", 0x0);
}
catch (e) {
throw new Exception("Cannot execute WMI query '" + query + "'.", e);
}
return result;
};
};

function ParseInputBool(inputVal, allowEmpty, errorMessage) {
if (inputVal === null || inputVal === "") {
if (allowEmpty) {
return "true";
}
else {
throw new Exception(errorMessage);
}
}
var supportedValues = ["true", "false", "t", "f", ".t.", ".f.", "1", "0"];
var replacements = ["true", "false", "true", "false", "true", "false", "true", "false"];

var processed = ("" + inputVal).trim().toLowerCase();
var pos = supportedValues.indexOf(processed);
if (pos &lt; 0) {
throw new Exception(errorMessage);
}
return replacements[pos];
}

var MAX_DRIVER_VERSION_STR = "99999999.99999999.99999999.99999999";

var DriverVersion = function (versionStr) {
arguments.callee.setAlias('DriverVersion.constructor');
var versionRegex = /^(\d{1,8})(.\d{1,8}){0,3}$/g;
if (!versionRegex.exec(versionStr)) {
throw new Exception("Invalid version string.");
}

var parts = versionStr.split(".");
this.major = parseInt(parts[0]);
this.minor = 0;
this.build = 0;
this.revision = 0;
if (parts.length &gt; 1) {
this.minor = parseInt(parts[1]);
if (parts.length &gt; 2) {
this.build = parseInt(parts[2]);
if (parts.length &gt; 3) {
this.revision = parseInt(parts[3]);
}
}
}

this.toString = function () {
arguments.callee.setAlias('DriverVersion.toString');
return "" + this.major + "." + this.minor + "." + this.build + "." + this.revision;
};

this.compareTo = function (v) {
arguments.callee.setAlias('DriverVersion.compareTo');
if (!(v instanceof DriverVersion)) {
throw new Exception("Parameter is not an instance of type DriverVersion.");
}
var d = this.major - v.major;
if (d !== 0) {
return d;
}
d = this.minor - v.minor;
if (d !== 0) {
return d;
}
d = this.build - v.build;
if (d !== 0) {
return d;
}
d = this.revision - v.revision;
return d;
};
};

var VersionRange = function (sStartVersion, sEndVersion) {
arguments.callee.setAlias('VersionRange.constructor');
this.startVersion = GetDriverVersionObj(sStartVersion);
this.endVersion = GetDriverVersionObj(sEndVersion);
};

function GetDriverVersionObj(oVersion) {
arguments.callee.setAlias('GetDriverVersionObj');
if (oVersion instanceof DriverVersion) {
return oVersion
} else {
if ((typeof oVersion) === "string") {
return new DriverVersion(oVersion);
}
}
throw new Exception("Parameter is not an instance of type DriverVersion.");
}

var RegistryValueTypes = {
"REG_SZ": 1,
"REG_EXPAND_SZ": 2,
"REG_BINARY": 3,
"REG_DWORD": 4,
"REG_MULTI_SZ": 7
};

function EnumerateRegistryKeyValues(hiveName, keyPath) {
arguments.callee.setAlias('EnumerateRegistryKeyValues');
var hiveId, ex;
switch (hiveName) {
case "HKEY_CLASSES_ROOT":
hiveId = 2147483648;
break;
case "HKEY_CURRENT_USER":
hiveId = 2147483649;
break;
case "HKEY_LOCAL_MACHINE":
hiveId = 2147483650;
break;
case "HKEY_USERS":
hiveId = 2147483651;
break;
case "HKEY_CURRENT_CONFIG":
hiveId = 2147483653;
break;
default:
throw new Exception("Registry hive name '" + hiveName + "' is invalid");
}

try {
var providerName = "StdRegProv";
var services = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\default");
var registry = services.Get(providerName);
var enumFuncName = "EnumValues";

var inParams = registry.Methods_(enumFuncName).InParameters.SpawnInstance_();
inParams.hDefKey = hiveId;
inParams.sSubKeyName = keyPath;
var outParams = registry.ExecMethod_(enumFuncName, inParams);

var valueNames = outParams.sNames.toArray();
var valueTypes = outParams.Types.toArray();

return { ValueNames: valueNames, ValueTypes: valueTypes };
}
catch (ex) {
throw new Exception("Cannot enumerate values of registry key '" + hiveName + "\\" + keyPath + "'", ex);
}
}

var DriverItem = function (sName, oNameVersion, oDriverVersion, oParseObj) {
arguments.callee.setAlias('DriverItem.constructor');
this.name = sName;
this.nameVersion = GetDriverVersionObj(oNameVersion);
this.driverVersion = GetDriverVersionObj(oDriverVersion);
this.parseObject = oParseObj;
};

var DriverSelectorRule = function (sNameRegex, sNameVersionRegex, sNameMinVersion, sNameMaxVersion, oVersionRangeArray) {
arguments.callee.setAlias('DriverSelectorRule.constructor');
var _computerId = ".";
this.nameRegex = sNameRegex;
this.nameVersionRegex = sNameVersionRegex;
this.nameMinVersion = GetDriverVersionObj(sNameMinVersion);
this.nameMaxVersion = GetDriverVersionObj(sNameMaxVersion);
var _versionRangeArray = oVersionRangeArray;
this.driverCollection = new Array();
this.isNativeClient = false;
var _nameRegexObj = new RegExp(sNameRegex);

var _nameVersionRegexObj = null;
if (sNameVersionRegex) {
if (sNameVersionRegex.length &gt; 0) {
_nameVersionRegexObj = new RegExp(sNameVersionRegex);
}
}

var checkVersion = function (oVersion, vMinVersion, vMaxVersion) {
arguments.callee.setAlias('DriverSelectorRule.checkVersion');
var vVersion = GetDriverVersionObj(oVersion);
return vVersion.compareTo(vMinVersion) &gt;= 0 &amp;&amp; (vVersion.toString() == MAX_DRIVER_VERSION_STR || vMinVersion.compareTo(vMaxVersion) == 0 || vVersion.compareTo(vMaxVersion) &lt; 0);
};

this.checkNameVersion = function (oVersion) {
arguments.callee.setAlias('DriverSelectorRule.checkNameVersion');
return checkVersion(oVersion, this.nameMinVersion, this.nameMaxVersion);
};

this.checkDriverVersion = function (oVersion) {
arguments.callee.setAlias('DriverSelectorRule.checkDriverVersion');
var result = false;
for (var i = 0; i &lt; _versionRangeArray.length; i++) {
if (checkVersion(oVersion, _versionRangeArray[i].startVersion, _versionRangeArray[i].endVersion)) {
result = true;
break;
}
}
return result;
};

this.matchName = function (sName) {
arguments.callee.setAlias('DriverSelectorRule.matchName');
if (_nameRegexObj.exec(sName)) {
return true;
}
return false;
};

this.getNameVersion = function (sName) {
arguments.callee.setAlias('DriverSelectorRule.getNameVersion');
if (!_nameVersionRegexObj) {
return new DriverVersion("0");
}
var matches = _nameVersionRegexObj.exec(sName);
if (matches) {
return new DriverVersion(matches[0]);
}
throw new Exception("Driver name or version detection expression is invalid");
};

this.getDriverVersion = function (sName) {
arguments.callee.setAlias('DriverSelectorRule.getDriverVersion');
var registry = new Registry();
var driverPath = registry.Read("HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBCINST.INI\\" + sName + "\\Driver");
try {
var objFso = new ActiveXObject("Scripting.FileSystemObject");
var sDllVersion = objFso.GetFileVersion(driverPath);
} catch (ex) {
throw new Exception("Cannot obtain driver version using path '" + driverPath + "'");
}
return new DriverVersion(sDllVersion);
};

this.addDriver = function (oDriver) {
arguments.callee.setAlias('DriverSelectorRule.addDriver');
if (!(oDriver instanceof DriverItem)) {
throw new Exception("Parameter is not an instance of type DriverItem.")
}
this.driverCollection.push(oDriver);
};

this.resetState = function () {
this.driverCollection = new Array();
};
};

var DriverSelector = function () {
arguments.callee.setAlias('DriverSelector.constructor');
var _selectorRules = new Array();
var _selectedDriverName = null;

var _computerId = ".";
var _defaultDriverName = "SQL Server";

var _ncli_ForceProtocolEncryption = false;
var _ncli_TrustServerCertificate = false;
var _ncli_tcpProtocolEnabled = true;
var _processed = false;
var _errorCollection = new Array();

var pr = new DriverSelectorRule("^SQL\\sServer\\sNative\\sClient\\s\\d{1,8}(\\.\\d{1,8})?$", "\\d{1,8}(\\.\\d{1,8})?$", "11.0", "11.0",
new Array(
new VersionRange("2011.110.6020.0", MAX_DRIVER_VERSION_STR),
new VersionRange("2011.110.5592.0", "2011.110.6000.0"),
new VersionRange("2011.110.5347.0", "2011.110.5522.0")));
pr.isNativeClient = true;
_selectorRules.push(pr);
_selectorRules.push(new DriverSelectorRule("^ODBC\\sDriver\\s\\d{1,8}(\\.\\d{1,8})?\\sfor\\sSQL\\sServer$", "\\d{1,8}(\\.\\d{1,8})?(?=\\sfor\\sSQL\\sServer$)", "11.0", MAX_DRIVER_VERSION_STR,
new Array(
new VersionRange("2014.120.4219.0", MAX_DRIVER_VERSION_STR),
new VersionRange("2014.120.2546.0", "2014.120.4000.0")
)));
pr = new DriverSelectorRule("^SQL\\sServer\\sNative\\sClient\\s\\d{1,8}(\\.\\d{1,8})?$", "\\d{1,8}(\\.\\d{1,8})?$", "0", MAX_DRIVER_VERSION_STR, [new VersionRange("0", MAX_DRIVER_VERSION_STR)]);
pr.isNativeClient = true;
_selectorRules.push(pr);
_selectorRules.push(new DriverSelectorRule("^ODBC\\sDriver\\s\\d{1,8}(\\.\\d{1,8})?\\sfor\\sSQL\\sServer$", "\\d{1,8}(\\.\\d{1,8})?(?=\\sfor\\sSQL\\sServer$)", "0", MAX_DRIVER_VERSION_STR, [new VersionRange("0", MAX_DRIVER_VERSION_STR)]));

function processSystemOdbcDrivers(ncProtocolsAreIntersected) {
arguments.callee.setAlias('DriverSelector.processSystemOdbcDrivers');
var i, j;
var registry = new Registry();
var oValues = EnumerateRegistryKeyValues("HKEY_LOCAL_MACHINE", "SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers");
var driverNameArr = oValues.ValueNames;
var valueTypeArr = oValues.ValueTypes;
for (i = 0; i &lt; driverNameArr.length; i++) {
try {
if (valueTypeArr[i] !== RegistryValueTypes.REG_SZ) {
continue;
}
var isInstalled = registry.Read("HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers" + "\\" + driverNameArr[i]);
if (isInstalled != "Installed") {
continue;
}
for (j = 0; j &lt; _selectorRules.length; j++) {
if (_selectorRules[j].matchName(driverNameArr[i])) {
if (!_selectorRules[j].isNativeClient || (_selectorRules[j].isNativeClient &amp;&amp; ncProtocolsAreIntersected)) {
var nameVersion = _selectorRules[j].getNameVersion(driverNameArr[i]);
if (_selectorRules[j].checkNameVersion(nameVersion)) {
var driverVersion = _selectorRules[j].getDriverVersion(driverNameArr[i]);
if (_selectorRules[j].checkDriverVersion(driverVersion)) {
var driverItem = new DriverItem(driverNameArr[i], nameVersion, driverVersion, _selectorRules[j]);
_selectorRules[j].addDriver(driverItem);
}
}
}
}
}
} catch (ex) {
addError(ex);
}
}
}

function getNsNameWithHighestVersion() {
arguments.callee.setAlias('DriverSelector.getNsNameWithHighestVersion');
var rootNs = "root\\Microsoft\\SqlServer";
var oWMI = new WMIProvider(rootNs);
var namespaces = oWMI.ExecQuery("SELECT Name FROM __NAMESPACE WHERE Name LIKE 'ComputerManagement%'");
if (namespaces.Count &gt; 0) {
var e = new Enumerator(namespaces);
var currentName = "";
for (; !e.atEnd() ; e.moveNext()) {
var nsName = e.item().Name;
currentName = nsName &gt; currentName ? nsName : currentName;
}
} else {
throw new Exception("No namespace 'ComputerManagement*' was found");
}
return rootNs + "\\" + currentName;
}

function getNativeClientOdbcSettings(namespaceFullName) {
arguments.callee.setAlias('DriverSelector.getNativeClientOdbcSettings');
var oWMI = new WMIProvider(namespaceFullName);
var oQuery = oWMI.ExecQuery("SELECT FlagName, FlagValue FROM ClientSettingsGeneralFlag");
if (oQuery.Count &gt; 0) {
var e = new Enumerator(oQuery);
for (; !e.atEnd() ; e.moveNext()) {
var prop = e.item();
switch (prop.FlagName) {
case "Force protocol encryption":
_ncli_ForceProtocolEncryption = prop.FlagValue;
break;
case "Trust Server Certificate":
_ncli_TrustServerCertificate = prop.FlagValue;
break;
}
}
}
}

function getEnabledNativeClientProtocols(namespaceFullName) {
var oWMI = new WMIProvider(namespaceFullName);
var oQuery = oWMI.ExecQuery("SELECT ProtocolName, ProtocolOrder FROM ClientNetworkProtocol");
var protocolsArr = [];

if (oQuery.Count &gt; 0) {
for (var e = new Enumerator(oQuery) ; !e.atEnd() ; e.moveNext()) {
if (e.item().ProtocolOrder &gt; 0) {
protocolsArr.push(e.item().ProtocolName.toLowerCase());
}
}
}
return protocolsArr;
}

function resetState() {
_errorCollection = new Array();
for (var i = 0; i &lt; _selectorRules.length; i++) {
_selectorRules[i].resetState();
}
}

function addError(oErr) {
var errStr = typeof (oErr.toString) === 'undefined' ? "[" + (oErr.number &amp; 0xFFFF) + "] " + oErr.message : oErr.toString();
_errorCollection.push(errStr);
}

this.processDrivers = function (enabledServerProtocols) {
arguments.callee.setAlias('DriverSelector.processDrivers');
var i, j;
resetState();

var ncNamespace = getNsNameWithHighestVersion();
var clientProtocols = getEnabledNativeClientProtocols(ncNamespace);
var ncProtocolsAreIntersected = clientProtocols.intersectsWith(enabledServerProtocols);

try {
processSystemOdbcDrivers(ncProtocolsAreIntersected);
} catch (ex) {
addError(ex);
_selectedDriverName = _defaultDriverName;
_processed = true;
return;
}
var currentSelect = null;
for (i = 0; i &lt; _selectorRules.length; i++) {
for (j = 0; j &lt; _selectorRules[i].driverCollection.length; j++) {
if (currentSelect) {
if (_selectorRules[i].driverCollection[j].nameVersion.compareTo(currentSelect.nameVersion) &gt;= 0 &amp;&amp; _selectorRules[i].driverCollection[j].driverVersion.compareTo(currentSelect.driverVersion) &gt;= 0) {
currentSelect = _selectorRules[i].driverCollection[j];
}
} else {
currentSelect = _selectorRules[i].driverCollection[j];
}
}
if (currentSelect) {
break;
}
}
if (currentSelect) {
_selectedDriverName = currentSelect.name;
if (currentSelect.parseObject.isNativeClient) {
try {
getNativeClientOdbcSettings(ncNamespace);
_ncli_tcpProtocolEnabled = ((getEnabledNativeClientProtocols(ncNamespace)).indexOf("tcp") &gt;= 0);
} catch (ex) {
addError(ex);
}
}
} else {
_selectedDriverName = _defaultDriverName;
}
_processed = true;
};

this.getErrorCollection = function () {
return _errorCollection.slice();
};

this.hasErrors = function () {
return _errorCollection.length &gt; 0;
};

function throwIfNotProcessed() {
if (!_processed) {
throw new Exception("Drivers are not processed. Call 'ProcessDrivers' first.");
}
}

this.getSelectedDriverName = function () {
throwIfNotProcessed();
return _selectedDriverName;
};

this.getUseFqdn = function () {
throwIfNotProcessed();
return _ncli_ForceProtocolEncryption &amp;&amp; !_ncli_TrustServerCertificate;
};

this.getClientTcpProtocolEnabled = function() {
throwIfNotProcessed();
return _ncli_tcpProtocolEnabled;
};
};


var UniqueCollection = function() {
var _dict = new ActiveXObject("Scripting.Dictionary");

this.put = function(item) {
if (!_dict.Exists(item)) {
_dict.add(item, '');
}
};

this.exists = function(item) {
return _dict.Exists(item);
};

this.get = function() {
return (new VBArray(_dict.Keys())).toArray();
};

this.clear = function() {
_dict.RemoveAll();
};
};

function CheckConnectionTarget(dbConnection, serverName, instanceName) {
arguments.callee.setAlias('CheckConnectionTarget');

var serverNameWithoutDomain = serverName;
var destinationTestQuery = "select CAST(SERVERPROPERTY('MachineName') AS nvarchar(128)) as ServerName, @@servicename as InstanceName";
var queryResult = dbConnection.ExecuteQuery(destinationTestQuery);
queryResult.MoveFirst();
if (!queryResult.EOF) {
var queryServerName = queryResult("ServerName").Value.toUpperCase();
var queryInstanceName = queryResult("InstanceName").Value.toUpperCase();
var dotPosition = serverName.indexOf(".");
if (dotPosition &gt; -1) {
serverNameWithoutDomain = serverName.substring(0, dotPosition);
}
if (serverNameWithoutDomain.toUpperCase() == queryServerName &amp;&amp; instanceName.toUpperCase() == queryInstanceName) {
return;
}
}
dbConnection.Close();
throw new Exception("Connection target check failed: connected to " + serverNameWithoutDomain + "\\" + instanceName + ", but got " + queryServerName + "\\" + queryInstanceName + ".");
};

function SqlTcpPortIsEmpty(tcpPort) {
return tcpPort == "" || tcpPort == "0";
}

function GetDataSource(server, tcpPort) {
var dataSource = server;
if (!SqlTcpPortIsEmpty(tcpPort)) {
var nameParts = dataSource.split("\\");
dataSource = nameParts[0] + "," + tcpPort;
}
return dataSource;
}

function GetConnectionString(driverName, dataSource, databaseName) {
return "Driver=" + EscapeConnStringValue(driverName) + ";Server=" + EscapeConnStringValue(dataSource) + ";Database=" + EscapeConnStringValue(databaseName) + ";Trusted_Connection=yes;";
}

function GetEnabledSqlServerProtocols(namespaceName, computerName, instanceName) {
var oWMI = new WMIProvider("root\\Microsoft\\SqlServer\\" + namespaceName);
var oQuery = oWMI.ExecQuery("SELECT ProtocolName, Enabled FROM ServerNetworkProtocol WHERE InstanceName = '" + EscapeWQLString(instanceName) + "'");
var protocolsArr = [];

if (oQuery.Count &gt; 0) {
for (var e = new Enumerator(oQuery) ; !e.atEnd() ; e.moveNext()) {
if (e.item().Enabled) {
protocolsArr.push(e.item().ProtocolName.toLowerCase());
}
}
}
return protocolsArr;
}

function GetSqlServerTcpIpSettings(instanceName) {
arguments.callee.setAlias('GetSqlServerTcpIpSettings');

var listenAllIps = false;
var e, e2, matches;
var uc = new UniqueCollection();
var ipSettings = new ActiveXObject("Scripting.Dictionary");
var portRegex = /(?:,|^)\s*([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])\s*(?=,|$)/g;
var oWMI = new WMIProvider("root\\Microsoft\\SqlServer\\" + SQL_WMI_NAMESPACE);

var oQuery = oWMI.ExecQuery("SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '" + EscapeWQLString(instanceName) + "' AND PropertyName = 'ListenOnAllIPs'");
if (oQuery.Count &gt; 0) {
e = new Enumerator(oQuery);
e.moveFirst();
var isListenAll = e.item();
if (isListenAll.PropertyNumVal === 1) {
listenAllIps = true;
}
}
if (listenAllIps) {
oQuery = oWMI.ExecQuery("SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '" + EscapeWQLString(instanceName) + "' AND IPAddressName = 'IPAll' AND (PropertyName = 'TcpPort' OR PropertyName = 'TcpDynamicPorts') AND PropertyStrVal != ''");
if (oQuery.Count &gt; 0) {
for (e = new Enumerator(oQuery) ; !e.atEnd() ; e.moveNext()) {
while (matches = portRegex.exec(e.item().PropertyStrVal)) {
if (!SqlTcpPortIsEmpty(matches[1])) {
uc.put(matches[1]);
}
}
}
ipSettings.add("IPAll", uc.get());
}
}
else {
oQuery = oWMI.ExecQuery("SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '" + EscapeWQLString(instanceName) + "' AND IPAddressName != '' AND PropertyName = 'Enabled' AND PropertyNumVal = 1");
if (oQuery.Count &gt; 0) {
for (e = new Enumerator(oQuery) ; !e.atEnd() ; e.moveNext()) {
var ipAddress = '';
var ipAddressName = e.item().IPAddressName;
var oQuery2 = oWMI.ExecQuery("SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '" + EscapeWQLString(instanceName) + "' AND IPAddressName = '" + EscapeWQLString(ipAddressName) + "' AND PropertyName = 'IpAddress' AND PropertyStrVal != ''");
if (oQuery2.Count &gt; 0) {
e2 = new Enumerator(oQuery2);
e2.moveFirst();
ipAddress = e2.item().PropertyStrVal;
}
else {
continue;
}
oQuery2 = oWMI.ExecQuery("SELECT * FROM ServerNetworkProtocolProperty WHERE ProtocolName = 'Tcp' AND InstanceName = '" + EscapeWQLString(instanceName) + "' AND IPAddressName = '" + this.EscapeWQLString(ipAddressName) + "' AND (PropertyName = 'TcpPort' OR PropertyName = 'TcpDynamicPorts') AND PropertyStrVal != ''");
uc.clear();
if (oQuery2.Count &gt; 0) {
for (e2 = new Enumerator(oQuery2) ; !e2.atEnd() ; e2.moveNext()) {
while (matches = portRegex.exec(e2.item().PropertyStrVal)) {
if (!SqlTcpPortIsEmpty(matches[1])) {
uc.put(matches[1]);
}
}
}
try {
ipSettings.add(ipAddress, uc.get());
}
catch (ex) { }
}
}
}
}
return { listenAllIPs: listenAllIps, ipSettings: ipSettings };
}

function GetAndCheckConnection(driverName, dataSource, databaseName, provider, timeout, machineName, instanceName) {
arguments.callee.setAlias('GetAndCheckConnection');

var connectionString = GetConnectionString(driverName, dataSource, databaseName);
var dbMasterConnection = new ADODB(connectionString, provider, timeout);
CheckConnectionTarget(dbMasterConnection, machineName, instanceName);
return dbMasterConnection;
}

function SmartConnect(serverName, databaseName, tcpPort, machineName, instanceName) {
arguments.callee.setAlias('SmartConnect');

var dataSource;
var targetName = serverName;
var lastError = null;
var errorMessageColl = [];

var enabledServerProtocols = GetEnabledSqlServerProtocols(SQL_WMI_NAMESPACE, machineName, instanceName);

var ds = new DriverSelector();
ds.processDrivers(enabledServerProtocols);
var hasErrors = ds.hasErrors();
var useFqdn = ds.getUseFqdn();
var driverName = ds.getSelectedDriverName();

//try to use SQL server browser
try {
dataSource = GetDataSource(serverName, "");
return GetAndCheckConnection(driverName, dataSource, databaseName, "", 15, machineName, instanceName);
} catch (ex) {
lastError = ex;
errorMessageColl.push("Connection to data source '" + dataSource + "' failed: " + ex.message);
}

if (enabledServerProtocols.indexOf("tcp") &gt;= 0 &amp;&amp; ds.getClientTcpProtocolEnabled()) {
var pathArray = serverName.split("\\");
var dsComputerName = pathArray[0];
targetName = useFqdn ? machineName : dsComputerName;

var tcpIpSettings = GetSqlServerTcpIpSettings(instanceName);

if (tcpIpSettings.listenAllIPs) {
for (var j = 0; j &lt; tcpIpSettings.ipSettings.item("IPAll").length; j++) {
try {
dataSource = GetDataSource(targetName, tcpIpSettings.ipSettings.item("IPAll")[j]);
return GetAndCheckConnection(driverName, dataSource, databaseName, "", 10, machineName, instanceName);
} catch(ex) {
lastError = ex;
errorMessageColl.push("Connection to data source '" + dataSource + "' failed: " + ex.message);
}
}
} else {
var ipArr = (new VBArray(tcpIpSettings.ipSettings.Keys())).toArray();
var upc = new UniqueCollection();
for (var i = 0; i &lt; ipArr.length; i++) {
if (!upc.exists(tcpIpSettings.ipSettings.item(ipArr[i])[0])) {
upc.put(tcpIpSettings.ipSettings.item(ipArr[i])[0]);
try {
dataSource = GetDataSource(targetName, tcpIpSettings.ipSettings.item(ipArr[i])[0]);
return GetAndCheckConnection(driverName, dataSource, databaseName, "", 10, machineName, instanceName);
} catch(ex) {
lastError = ex;
errorMessageColl.push("Connection to data source '" + dataSource + "' failed: " + ex.message);
}
}
}
if (!useFqdn) {
for (var i = 0; i &lt; ipArr.length; i++) {
var portArr = tcpIpSettings.ipSettings.item(ipArr[i]);
for (var j = 0; j &lt; portArr.length; j++) {
try {
dataSource = GetDataSource(ipArr[i], tcpIpSettings.ipSettings.item(ipArr[i])[j]);
return GetAndCheckConnection(driverName, dataSource, databaseName, "", 10, machineName, instanceName);
} catch(ex) {
lastError = ex;
errorMessageColl.push("Connection to data source '" + dataSource + "' failed: " + ex.message);
}
}
}
}
}
}
throw new Exception("Cannot connect to the target Sql Server instance. Connection log:\n" + errorMessageColl.join("\n"), lastError);
}

//#Include File:SetSQL2005DBState.js
//Copyright (c) Microsoft Corporation. All rights reserved.

// Arguments (3)
// Arg 0: SQL Connection String
// Arg 1: SQL Database Name
// Arg 2: State to set to (valid SQL state e.g. Offline or Online)


var ScriptName = "Set SQL 2005 DB State";
var ADOConnectionTimeout = 30
// Failure Conidtions
var SCRIPT_ARG_FAILURE = -1;
var SCRIPT_ARG_FAILURE_MSG = "Invalid arguments passed to script";
var SCRIPT_CONNECT_FAILURE = -2;
var SCRIPT_CONNECT_FAILURE_MSG = "Could not connect to SQL";

var scriptArgs = WScript.Arguments;
if (scriptArgs.Length == 6) {
SetDBState(scriptArgs(0), scriptArgs(1), scriptArgs(2), scriptArgs(3), scriptArgs(4), scriptArgs(5));
}

function EscapeDBName(strValue) {
return strValue.replace(/]/g, "]]");
}

function SetDBState(connectionString, tcpPort, databaseName, databaseState, targetComputer, instanceName) {
var sqlServer;
try {
sqlServer = SmartConnect(connectionString, "master", tcpPort, targetComputer, instanceName);
} catch (e) {
PrintError(e);
FailScript(e, SCRIPT_CONNECT_FAILURE_MSG);
}
if (sqlServer != null) {
try {
var sqlQuery = "ALTER DATABASE [" + EscapeDBName(databaseName) + "] SET " + databaseState;
WScript.Echo("Executing Query: '" + sqlQuery + "' for instance: '" + connectionString + "'");
sqlServer.ExecuteQuery(sqlQuery);
}
catch (e) {
PrintError(e);
FailScript(e, SCRIPT_CONNECT_FAILURE_MSG);
}

}
}

function PrintError(error) {
WScript.StdErr.WriteLine("============================= BEGIN SCRIPT ERROR =================================\n");
WScript.StdErr.WriteLine("Script Name : " + ScriptName);
WScript.StdErr.WriteLine("Error Type : " + error);
WScript.StdErr.WriteLine("Error Number : " + error.number);
WScript.StdErr.WriteLine("Error Code : " + (error.number &amp; 0xFFFF));
WScript.StdErr.WriteLine("Win32 Facility : " + (error.number &gt;&gt; 16 &amp; 0x1FFF));
WScript.StdErr.WriteLine("Error Source : " + error.Source);
WScript.StdErr.WriteLine("Error Description : " + error.description + "\n");
WScript.StdErr.WriteLine("============================== END SCRIPT ERROR ==================================\n");
}
function FailScript(error, sMessage) {
var opsmgrAPI;

opsmgrAPI = new ActiveXObject("MOM.ScriptAPI");

opsmgrAPI.LogScriptEvent("SetSQL2005DBState.js", 4000, 1, sMessage &amp; ". " &amp; error.description);
}
</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</WriteAction>
</MemberModules>
<Composition>
<Node ID="WA"/>
</Composition>
</Composite>
</ModuleImplementation>
<InputType>System!System.BaseData</InputType>
</WriteActionModuleType>