SQL 2008 Database Set State

Microsoft.SQLServer.2008.SetDBState (WriteActionModuleType)

This module type is used to change the state of Microsoft SQL Server 2008 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.2008.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>SetSQL2008DBState.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:SQL2008Constants.js

var SQL_WMI_NAMESPACE = "ComputerManagement10";

var MANAGEMENT_PACK_VERSION = "6.7.20.0";

//#Include File:Common.js

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

var SQL_SERVICE_DEFAULT_NAME = "MSSQLSERVER";

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

if (!Array.prototype.indexOf) {
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, '');
};
}

String.prototype.padLeft = function(length, padStr) {
var tmpStr = this;
padStr = padStr || " ";
while (tmpStr.length &lt; length)
tmpStr = padStr + tmpStr;
return tmpStr;
};

Date.prototype.toISO8601UtcString = function () {
function padLeft(number, length) {
return ("" + number).padLeft(length, "0");
}

return padLeft(this.getUTCFullYear(), 4) +
'-' + padLeft(this.getUTCMonth() + 1, 2) +
'-' + padLeft(this.getUTCDate(), 2) +
'T' + padLeft(this.getUTCHours(), 2) +
':' + padLeft(this.getUTCMinutes(), 2) +
':' + padLeft(this.getUTCSeconds(), 2) +
'Z';
};

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

function EscapeWQLString(wqlString) {
return wqlString.replace(/\\/g,"\\\\").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;

this.ErrorReturnEmptyDiscovery = function (sourceId, managedEntityId) {
var discoveryData = this.ScriptAPI.CreateDiscoveryData(0, sourceId, managedEntityId);
discoveryData.IsSnapshot = false;
this.ScriptAPI.Return(discoveryData);
}
};
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 &amp;&amp; connection.State != 0) {
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 || ".";
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');

// DEPRECATED
var _selectorRules = DriverSelector.createSelectorRules();
var _selectedDriverName = null;

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

// DEPRECATED
var _ncli_ForceProtocolEncryption = false;
var _ncli_TrustServerCertificate = false;
var _ncli_tcpProtocolEnabled = true;
var _ncli_smProtocolEnabled = true;

var _processed = false;
var _errorCollection = [];

// TODO: 2
function getNsNameWithHighestVersion(computerName) {
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;
}

// TODO: 1
function getNativeClientOdbcSettings(namespaceFullName, params) {
arguments.callee.setAlias('DriverSelector.getNativeClientOdbcSettings');

// computerName must be '.' or not provided
var wmi = new WMIProvider(namespaceFullName);
var props = null;

// query can fail, because native client not supported
try {
props = wmi.ExecQuery("SELECT FlagName, FlagValue FROM ClientSettingsGeneralFlag");
} catch (e) {
// do nothing, its ok, just skip this settings
return;
}

if (props.Count &gt; 0) {
var e = new Enumerator(props);
for (; !e.atEnd() ; e.moveNext()) {
var prop = e.item();
switch (prop.FlagName) {
case "Force protocol encryption":
// _ncli_ForceProtocolEncryption = prop.FlagValue;
params.isForceProtocolEncryption = prop.FlagValue;
break;
case "Trust Server Certificate":
// _ncli_TrustServerCertificate = prop.FlagValue;
params.isTrustServerCertificate = prop.FlagValue;
break;
}
}
}
}

/*
* @namespace - full name
*/
function getClientProtocolsFromWMI(namespace) {
var protocols = [];

// create wmi provider for local machine
var wmi = new WMIProvider(namespace);
var result = null;

try {
result = wmi.ExecQuery('SELECT ProtocolName, ProtocolOrder FROM ClientNetworkProtocol');
} catch (e) {
// do nothing
}

// extract protocols from query
if (result &amp;&amp; result.Count &gt; 0) {
for (var e = new Enumerator(result); !e.atEnd(); e.moveNext()) {
if (e.item().ProtocolOrder &gt; 0) {
protocols.push(e.item().ProtocolName.toLowerCase());
}
}
}

return protocols;
}

/*
* Look if driver is Native client
* @namespace - full name
*/
// rename getClientProtols
function getClientProtocolsFromRegistry(rules) {
// TODO: read

return null;
}

// TODO: 3
function getEnabledNativeClientProtocols(namespace) {
arguments.callee.setAlias('getEnabledNativeClientProtocols');

// TODO: WMI will be replaced by reading from registry
// var oQuery = null;
// var protocols = [];

// try read from WMI
// can fail because namespace remains empty for sql cluster with empty
// node
// computerName for WMIProvider must be '.' or not provided, read
// locally
// var oWMI = new WMIProvider(namespace);
// try {
// oQuery = oWMI.ExecQuery("SELECT ProtocolName, ProtocolOrder FROM ClientNetworkProtocol");
// } catch (e) {
// // do nothing
// }

// TODO: check oQuery and try read protocols from registry

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

// we try to use WMI as less as possible, read from registry first
return getClientProtocolsFromRegistry(namespace) || getClientProtocolsFromWMI(namespace);
}

/*
* Fill DriverSelector properties
* 3. getEnabledNativeClientProtocols:
* return named protocols ['tcp', 'sm', 'np']
* 2. getNsNameWithHighestVersion:
* return namespace
* 1. getNativeClientOdbcSettings:
* _ncli_ForceProtocolEncryption
* _ncli_TrustServerCertificate
*/
// REFACTOR
// 1 + 2 + 3
function getClientParameters() {
arguments.callee.setAlias('DriverSelector.getClientParameters');

var params = DriverSelector.createConnectionParams('.');

params.namespace = getNsNameWithHighestVersion();
try {
// read security settings from WMI
getNativeClientOdbcSettings(params.namespace, params);
} catch (e) {
// TODO: read security settings from registry
// throw e;
}
params.protocols = getEnabledNativeClientProtocols(params.namespace);

return params;
}

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);
}

function selectFreshDriver(rules) {
var selected = null;
var rule = null;
var driver = null;

for (var r = 0; r &lt; rules.length; ++r) {
rule = rules[r];

for (var d = 0; d &lt; rules[r].driverCollection.length; ++d) {
driver = rule.driverCollection[d];

// select first if not selected
if (selected === null) {
selected = driver;
} else {
// select fresh, compare driver with selected by name and version
if (driver.nameVersion.compareTo(selected.nameVersion) &gt;= 0 &amp;&amp;
driver.driverVersion.compareTo(selected.driverVersion) &gt;= 0) {
selected = driver;
}
}
}

// all rules have order by priority, if rule contains drivers, then
// selected with high priority
if (selected) break;
}

return selected;
}

// Select most appropriate driver from filtered installed system (ODBC) drivers.
// select all available drivers
// Filter by driver name and version
// Intersected: check client and server have shared protocols
// tcp and np (Named Pipes) can work by network, sm can work only locally
// driver priorities: sm, tcp; np not used
//
// For native client need common client and server protocols
//
// Select latest namespace with highest version
// Select client protocols
// Select server protocols (enabled)
// Intersect client and server protocols
// Select odbc drivers related to inresected protocols
// We have 3 possible drivers:
// - ODBC (all protocols enabled)
// - Native Client (tcp, sm, np protocols)
// only native client can choose protocols through registry settings
// - Microsoft SQL Server (all protocols enabled)
this.processDrivers = function (serverProtocols) {
arguments.callee.setAlias('DriverSelector.processDrivers');

resetState();

var client = getClientParameters();

try {
var ncProtocolsAreIntersected = client.protocols.intersectsWith(serverProtocols);
DriverSelector.processSystemOdbcDrivers(_selectorRules, ncProtocolsAreIntersected);
} catch (ex) {
addError(ex);
_selectedDriverName = _defaultDriverName;
_processed = true;
return;
}

var driver = selectFreshDriver(_selectorRules);

// for native client detect tcp protocol is enabled,
// supposed driver selected and filled client params
if (driver &amp;&amp; driver.parseObject.isNativeClient) {
// TODO: take intersected protocols?
// _ncli_tcpProtocolEnabled = client.protocols.indexOf("tcp") &gt;= 0;
client.isTcpProtocolEnabled = client.protocols.indexOf('tcp') &gt;= 0;
client.isSharedMemoryProtocolEnabled = client.protocols.indexOf('sm') &gt;= 0;
}

if (driver) client.driverName = driver.name;

// for compatibility fill deprecated
_selectedDriverName = client.driverName;
_ncli_ForceProtocolEncryption = client.isForceProtocolEncryption;
_ncli_TrustServerCertificate = client.isTrustServerCertificate;
_ncli_tcpProtocolEnabled = client.isTcpProtocolEnabled;
_ncli_smProtocolEnabled = client.isSharedMemoryProtocolEnabled;

_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;
};

this.getClientSharedMemoryProtocolEnabled = function () {
throwIfNotProcessed();
return _ncli_smProtocolEnabled;
};
};


DriverSelector.DEFAULT_DRIVER_NAME = 'SQL Server';


DriverSelector.createConnectionParams = function(computerName) {
return {
computerName: computerName,
driverName: DriverSelector.DEFAULT_DRIVER_NAME,
namespace: '',
isForceProtocolEncryption: false,
isTrustServerCertificate: false,
isTcpProtocolEnabled: true,
isSharedMemoryProtocolEnabled: true,
protocols: []
};
};

// all rules ordered by priority
DriverSelector.createSelectorRules = function() {
var rules = [];

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 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;
rules.push(pr);

rules.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 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;
rules.push(pr);

rules.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)]));

return rules;
};


// Get available drivers in the system and fill rules drivers
// TODO: rename method
DriverSelector.processSystemOdbcDrivers = function(rules, isProtocolsIntersected) {
arguments.callee.setAlias('DriverSelector.processSystemOdbcDrivers');

var registry = new Registry();
var keys = EnumerateRegistryKeyValues("HKEY_LOCAL_MACHINE", "SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers");
var drivers = keys.ValueNames;
var values = keys.ValueTypes;
for (var i = 0; i &lt; drivers.length; ++i) {
try {
if (values[i] !== RegistryValueTypes.REG_SZ) {
continue;
}
var isInstalled = registry.Read("HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers" + "\\" + drivers[i]);
if (isInstalled != "Installed") {
continue;
}
var rule = null;
for (var j = 0; j &lt; rules.length; ++j) {
rule = rules[j];
if (rule.matchName(drivers[i])) {
// TODO: extract filtering
if (!rule.isNativeClient || (rule.isNativeClient &amp;&amp; isProtocolsIntersected)) {
var nameVersion = rule.getNameVersion(drivers[i]);
if (rule.checkNameVersion(nameVersion)) {
var driverVersion = rule.getDriverVersion(drivers[i]);
if (rule.checkDriverVersion(driverVersion)) {
var driverItem = new DriverItem(drivers[i], nameVersion, driverVersion, rule);
rule.addDriver(driverItem);
}
}
}
}
}
} catch (ex) {
addError(ex);
}
}
};


var UtcDateOperations = function () {
this.iso8601UtcStringToDate = function (sDate) {
var matches = /^(\d{4})-(\d\d)-(\d\d)(?:T|\s)(\d\d):(\d\d):(\d\d)Z$/g.exec(sDate);

if (!matches) {
throw new Exception("Input date string is in invalid format");
}

var year = parseInt(matches[1], 10);
var month = parseInt(matches[2], 10) - 1;
var day = parseInt(matches[3], 10);

var hour = parseInt(matches[4], 10);
var minute = parseInt(matches[5], 10);
var second = parseInt(matches[6], 10);

return new Date(Date.UTC(year, month, day, hour, minute, second));
};

this.checkSecondsElapsed = function (sDate, nSeconds) {
var utcNow = new Date();
var utcDate = this.iso8601UtcStringToDate(sDate);
return (((utcNow - utcDate) / 1000) &gt; nSeconds);
};
};

function GetSqlServiceName(instanceName) {
arguments.callee.setAlias('GetServiceName');

if (instanceName == SQL_SERVICE_DEFAULT_NAME) {
return instanceName;
}
return "MSSQL$" + instanceName;
}

function GetWMISingleValue(wmiProvider, query, propertyName) {
arguments.callee.setAlias('GetWMISingleValue');

return (new Enumerator(wmiProvider.ExecQuery(query))).item()[propertyName];
}

function GetCacheKey(stateMpPrefix, sKeyName) {
var oApi = new OpsMgrAPI();
var regKey = oApi.ScriptAPI.GetScriptStateKeyPath(ManagementGroupID);
regKey = regKey + "\\" + stateMpPrefix + "\\" + sKeyName;
return regKey;
}

function GetStringValueFromCache(sKeyName, sValueName, cacheExpirationTime) {
var stateMpPrefix = "SQLMPSP1";

var udo = new UtcDateOperations();
var oReg = new Registry();

try {
var regKey = GetCacheKey(stateMpPrefix, sKeyName);

var sValuePath = "HKEY_LOCAL_MACHINE\\" + regKey + "\\" + sValueName;
var sDatePath = sValuePath + "_CreationTime";

var sDate = oReg.Read(sDatePath);
var sValue = oReg.Read(sValuePath);

if (udo.checkSecondsElapsed(sDate, cacheExpirationTime)) {
return null;
}
return sValue;
} catch (ex) {
return null;
}
}

function PutStringValueToCache(sKeyName, sValueName, sValue) {
var stateMpPrefix = "SQLMPSP1";

var oReg = new Registry();

try {
var regKey = GetCacheKey(stateMpPrefix, sKeyName);

var sValuePath = "HKEY_LOCAL_MACHINE\\" + regKey + "\\" + sValueName;
var sDatePath = sValuePath + "_CreationTime";

var sDateUtc = (new Date()).toISO8601UtcString();

oReg.Write(sValuePath, sValue, "REG_SZ");
oReg.Write(sDatePath, sDateUtc, "REG_SZ");
} catch (ex) {
}
}

function EscapeCacheValueName(name) {
return name.replace(/_/g, "__");
}

function GetSqlServerHostName(strDNSComputerName, instanceName, namespace) {
arguments.callee.setAlias('GetSqlServerHostName');

var serviceName = GetSqlServiceName(instanceName);
var escapedServiceName = EscapeWQLString(serviceName);

var wmiProvider = new WMIProvider("ROOT\\Microsoft\\SqlServer\\" + namespace, strDNSComputerName);

var isClustered = GetWMISingleValue(wmiProvider, "SELECT PropertyNumValue FROM SqlServiceAdvancedProperty WHERE PropertyName = 'Clustered' AND SqlServiceType = 1 AND ServiceName = '" + escapedServiceName + "'", "PropertyNumValue");

var hostName = null;
if (isClustered == 0) {
hostName = GetWMISingleValue(wmiProvider, "SELECT HostName FROM SqlService WHERE SQLServiceType = 1 AND ServiceName = '" + escapedServiceName + "'", "HostName");
} else {
hostName = GetWMISingleValue(wmiProvider, "SELECT PropertyStrValue FROM SqlServiceAdvancedProperty WHERE PropertyName = 'VSNAME' AND SqlServiceType = 1 AND ServiceName = '" + escapedServiceName + "'", "PropertyStrValue");
}

return {
hostName: hostName,
isClustered: isClustered === 1 ? true : false
};
}

function GetSqlServerHostNameEx(strDNSComputerName, instanceName, namespace) {
arguments.callee.setAlias('GetSqlServerHostNameEx');
var hostValueName = EscapeCacheValueName(strDNSComputerName);
var isClusteredValueName = hostValueName + "_IsClustered";
var cacheExpirationTime = 7200;

var hostName = GetStringValueFromCache("SqlHostNames", hostValueName, cacheExpirationTime);
if (hostName !== null) {
var isClusteredStr = GetStringValueFromCache("SqlHostNames", isClusteredValueName, cacheExpirationTime);
if (isClusteredStr !== null &amp;&amp; ((isClusteredStr === "1") || (isClusteredStr === "0"))) {
return {
hostName: hostName,
isClustered: isClusteredStr == "0" ? false : true
};

}
}

var hostNameData = GetSqlServerHostName(strDNSComputerName, instanceName, namespace);

PutStringValueToCache("SqlHostNames", hostValueName, hostNameData.hostName);
PutStringValueToCache("SqlHostNames", isClusteredValueName, hostNameData.isClustered ? "1" : "0");

return hostNameData;
}

function GetLocalHostName() {
arguments.callee.setAlias('GetLocalHostName');

var wshShell = new ActiveXObject("WScript.Shell");
return wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%");
};

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, hostName, instanceName) {
arguments.callee.setAlias('CheckConnectionTarget');

var destinationTestQuery = "select CAST(SERVERPROPERTY('MachineName') AS nvarchar(128)) as ServerName, @@servicename as InstanceName";

try {
var queryResult = dbConnection.ExecuteQuery(destinationTestQuery);
queryResult.MoveFirst();
if (!queryResult.EOF) {
var queryServerName = queryResult("ServerName").Value.toUpperCase();
var queryInstanceName = queryResult("InstanceName").Value.toUpperCase();

if (hostName.toUpperCase() == queryServerName &amp;&amp; instanceName.toUpperCase() == queryInstanceName) {
return;
}
throw new Exception("Connection target check failed: connected to " + hostName + "\\" + instanceName + ", but got " + queryServerName + "\\" + queryInstanceName + ".");
}
} catch (ex) {
if (dbConnection) {
dbConnection.Close();
}
throw ex;
}
};

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

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

function BuildDataSourceFromParts(computerName, instanceName, tcpPort) {
var dataSource = computerName;
if (instanceName !== "MSSQLSERVER") {
dataSource = computerName + "\\" + instanceName;
}
return GetDataSource(dataSource, tcpPort);
}

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, computerName) {
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, computerName);

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, hostName, instanceName) {
arguments.callee.setAlias('GetAndCheckConnection');

var connectionString = GetConnectionString(driverName, dataSource, databaseName);
var dbMasterConnection = new ADODB(connectionString, provider, timeout);
CheckConnectionTarget(dbMasterConnection, hostName, 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 netBiosHostNameData = GetSqlServerHostNameEx(machineName, instanceName, SQL_WMI_NAMESPACE);
var netBiosHostName = netBiosHostNameData.hostName;
var dnsHostName = machineName.split(".")[0];

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();

var connStr = serverName;

// Sql Server Shared Memory protocol require usage of host's NetBios name.
// Shared Memory usually the first in the driver's priority list.
// Rebuild data source string in the case of standalone Sql Server instance, NetBios host name differs
// from DNS host name and enabled Shared Memory on Client and Server
if (netBiosHostName !== dnsHostName &amp;&amp; !netBiosHostNameData.isClustered &amp;&amp; enabledServerProtocols.indexOf("sm") &gt;= 0 &amp;&amp; ds.getClientSharedMemoryProtocolEnabled) {
var localHostName = GetLocalHostName();
if (netBiosHostName === localHostName) {
connStr = "lpc:" + BuildDataSourceFromParts(netBiosHostName, instanceName, null);
}
}

//try to use SQL server browser
try {
dataSource = GetDataSource(connStr, "");
return GetAndCheckConnection(driverName, dataSource, databaseName, "", 15, netBiosHostName, 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, dsComputerName);

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, netBiosHostName, 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, netBiosHostName, 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, netBiosHostName, 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:SetSQL2008DBState.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 2008 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.Echo("============================= BEGIN SCRIPT ERROR =================================\n");
WScript.Echo("Script Name : " + WScript.ScriptName);

var currErr = null;
if ((error instanceof Exception) &amp;&amp; error.innerException != null) {
currErr = error.innerException;
}
else if (error instanceof Error) {
currErr = error;
}

if (currErr != null) {
if (typeof currErr.name !== 'undefined') {
WScript.Echo("Error Type : " + currErr.name);
}
WScript.Echo("Error Number : " + currErr.number);
WScript.Echo("Error Code : " + (currErr.number &amp; 0xFFFF).toString());
WScript.Echo("Win32 Facility : " + (currErr.number &gt;&gt; 16 &amp; 0x1FFF).toString());
if (typeof currErr.source !== 'undefined') {
WScript.Echo("Error Source : " + currErr.source);
}
WScript.Echo("Error Description : " + currErr.description + "\n");
}
else {
WScript.Echo(error.toString());
}
WScript.Echo("============================== END SCRIPT ERROR ==================================\n");
}
function FailScript(error, sMessage) {
var opsmgrAPI;

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

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