Alternatives for different functionality in DSM 2015.2

Based on the changes introduced in DSM-version 2015.2 in the Policy-handling area, perhaps some of your scripts or applications need to be adopted. Because of object-types, properties, methods or enumeration values no longer being available, it can happen that existing code doesn't work anymore or results in errors. This chapter lists some of the possibly affected actions:


Optionvalue PrepareForReinstall of the option OperationMode from Computer-objects:


The commands


$MyComputer.OperationMode = "PrepareForReinstall"

$MyComputer.Update()


and also calling the appropriate method


$MyComputer.PrepareForReinstall()

       

do not work any longer and result in throwing an error message.


The reason is, that the value PrepareForReinstall is no longer valid for the property OperationMode (Computer.OperationMode) 


As a workaround, in some situations the following commands can be used:


$MyComputer.OperationMode = "Inactive"

$MyComputer.Update()


or alternatively 


$MyComputer.Deactivate()


During a computer-reinstallation


$MyComputer | Reinstall-EmdbComputer <options> -- without -StartImmediate


the Reinstall-EmdbComputer cmdlet can be uses without the switch -StartImmediately. After finishing the action, the value of the OperationMode property of the Computer is Inactive.


Note: For DSM versions prior DSM 2015.2 when executing the Reinstall-EmdbComputer cmdlet, the value of the OperationMode property ist set to PrepareForReinstall.



Properties ServerRolloutState and ExecutionMode of Policy-Instances:


The commands


$MyPolicyInstance.ServerRolloutState = "<Wert>"

$MyPolicyInstance.ExecutionMode = "<Wert>"

$MyPolicyInstance.Update()

       

do no longer work and result in an error message.


The reason for this new behaviour is, that the properties ServerRolloutState and ExecutionMode of Policy-Instances are now write-protected.


1. Reinstallation of Policy-Instances


That means, instead of the code that was used in prior versions of DSM, like the one below


$MyPolicyInstance.ServerRolloutState = "ToBeRedelivered"

$MyPolicyInstance.ExecutionMode = "Reinstall"

$MyPolicyInstance.Update()


either the Reinstall()-method


$MyPolicyInstance.Reinstall()


or the following code


$MyPolicyInstance.ReinstallRequestNumber++

$MyPolicyInstance.Update()


has to be used


Note: For DSM versions prior DSM 2015.2 when calling the Reinstall()-method, the properties ServerRolloutState and ExecutionMode are used.


2. Repair of Policy-Instances


That means, in order to execute Policy-Instances again in Repair-mode, instead of using the following code


$MyPolicyInstance.ServerRolloutState = "ToBeRedelivered"

$MyPolicyInstance.ExecutionMode = "Repair"

$MyPolicyInstance.Update()


either the Repair()-method


$MyPolicyInstance.Repair()


or the following commands


$MyPolicyInstance.RepairRequestNumber++

$MyPolicyInstance.Update()


must be used.


Note: For DSM versions prior DSM 2015.2 when calling the Repair()-method, the properties ServerRolloutState and ExecutionMode are used.



Functional extensions TargetID:Resolve... for LDAP filter at SOAP API GetPolicyList (EmdbHelpers.GetEmdbPolicyList)


The functional extensions TargetID:Resolve... are no longer available. Their use results in an error message. 


Remedy:

1. Extension TargetID:ResolveDirect


$MyTarget = Get-EmdbComputer ...

$MyTarget.GetPolicies()

$MyTarget.GetPolicies($null, "ThisItemIsTarget") # $null = means all Policy-Types


2. Extension TargetID:ResolveGroups


$MyTarget = Get-EmdbComputer ...

$MyTarget.GetPolicies($null, "ThisItemHierarchyIsTarget") # $null = means all Policy-Types


Note: This command retrieves, as apposed to TargetID:ResolveGroups, also Policies for Dynamic Groups.


3. Extension TargetID:ResolveHierarchical


$MyTarget = Get-EmdbComputer ...

$MyTarget.GetPolicies($null, "ThisItemGroupsIsTarget") # $null = means all Policy-Types


4. Extension TargetID:ResolveDirectIn


a) option also available in older DSM versions (EmdbHelpers: GetEmdbPolicyList, GetEmdbPolicies):


$targets = Get-EmdbComputer ...

$drive = $targets[0].Drive

$ids = $targets | % { $_.ID }

$in = [string]::Join(",", $ids)

$ldap = New-Object NwcServices.EnteoV6Tools.Blsadministration.BlsLdapUrl $null, "subtree", $null, "TargetId:ResolveDirectIn=$($in)" # <path>, <scope>, <attributes>, <filter>

$ids = [NwcServices.EnteoV6Tools.Blsadministration.EmdbHelpers]::GetEmdbPolicyList($drive, $ldap) | % { $_.ID }

$policies = [NwcServices.EnteoV6Tools.Blsadministration.EmdbHelpers]::GetEmdbPolicies($drive, $ids)


b) based on assignment targets (method GetPolicies on the assignment target)


$targets = Get-EmdbComputer ...

# .GetPolicies() = all Policy-Types, or e.g. .GetPolicies("SwPolicy") = Software-Policies only...

$policies = $targets | % { $_.GetPolicies() } | sort -Property ID -Unique


c) based on Policy-Types (method GetPolicies on the BlsEmdb drive)


$targets = Get-EmdbComputer ...

$drive = $targets[0].Drive

$lookup = @{}; $targets | % { $lookup[$_.ID] = $_ }

# .GetPolicies() = all, or e.g. .GetPolicies("SwPolicy") = Software-Policies only...

$policies = $drive.GetPolicies() | where { @($_.TargetObjectList | where { $lookup.ContainsKey($_.TargetObjectID) }).Count -gt 0 }


d) based on Policy-Types (EmdbHelpers: GetEmdbPolicyList, GetEmdbPolicies)


$targets = Get-EmdbComputer ...

$drive = $targets[0].Drive

$ids = $targets | % { $_.ID }

$in = [string]::Join(",", $ids)

$ldap = New-Object NwcServices.EnteoV6Tools.Blsadministration.BlsLdapUrl $null, "subtree", $null, "SchemaTag=SwPolicy" # <path>, <scope>, <attributes>, <filter>

$ids = [NwcServices.EnteoV6Tools.Blsadministration.EmdbHelpers]::GetEmdbPolicyList($drive, $ldap) | % { $_.ID }

$ldap = New-Object NwcServices.EnteoV6Tools.Blsadministration.BlsLdapUrl $null, "subtree", $null, "SchemaTag=PnpPolicy" # <path>, <scope>, <attributes>, <filter>

$ids += [NwcServices.EnteoV6Tools.Blsadministration.EmdbHelpers]::GetEmdbPolicyList($drive, $ldap) | % { $_.ID }

$policies = [NwcServices.EnteoV6Tools.Blsadministration.EmdbHelpers]::GetEmdbPolicies($drive, $ids)


Note: One SOAP request per Policy(-Schema)-type seems necessary. An LDAP filter like

$ldap = New-Object NwcServices.EnteoV6Tools.Blsadministration.BlsLdapUrl $null, "subtree", $null, "(|(SchemaTag=SwPolicy)(SchemaTag=PnpPolicy))"

is plausible and syntactically correct - but is not accepted by the BLS. An LDAP filter like

$ldap = New-Object NwcServices.EnteoV6Tools.Blsadministration.BlsLdapUrl $null, "subtree", $null, "(|(PolicySchemaTag=SwPolicy)(PolicySchemaTag=PnpPolicy))"

ist accepted by the BLS and returns the correct results, but is not described in the API documentation.


Note: Independent how $targets is retrieved, the options described above need...

a)   : two SOAP calls (GetEmdbPolicyList, GetEmdbPolicies)

b)   : one SOAP call per assignment-target (<target>.GetPolicies(...))

c)   : two SOAP call per Policy-Type (<drive>.GetPolicies(...)) [* if a Policy-Type is not present, the second SOAP call is omitted]

d)   : one SOAP call per Policy-Type (GetEmdbPolicyList) plus one SOAP call (GetEmdbPolicies) [* closest to a)]


Note: a) and d) are returning MdsPolicy objects, b) and c) are returning EmdbPolicy objects

(conversion MdsPolicy to EmdbPolicy e.g..: $emdbPolicies = [NwcServices.EnteoV6Tools.Blsadministration.EmdbItem]::AsEmdbItem($mdsPolicies, $drive) )