-
Notifications
You must be signed in to change notification settings - Fork 1
/
FixOrchestration.ps1
75 lines (69 loc) · 2.31 KB
/
FixOrchestration.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Import-module SQLPS
Import-Module ConfigurationManager
$MEMCMDB = Get-AutomationVariable -Name MEMCMDataBase #"ConfigMgr_CHQ"
$MEMCMServer = Get-AutomationVariable -Name MEMCMServer # "CM1.corp.contoso.com"
$Query = "
with CTE As (SELECT
og.Name 'GroupName'
,OGM.[Name]
,OGM.[SiteCode]
,[IsActive]
,OGM.[MOGID]
,[ResourceID]
,OGM.[MOG_UniqueID]
,OGM.SequenceNumber
,[CurrentState]
,[StateCode]
,[LockAcquiredTime]
,[LastStateReportedTime]
,s.ServerName
,CASE WHEN ogm.CurrentState=1 THEN 'Idle'
WHEN ogm.CurrentState=2 THEN 'Waiting'
WHEN ogm.CurrentState=3 THEN 'In Progress'
WHEN ogm.CurrentState=4 THEN 'Failed'
WHEN ogm.CurrentState=5 THEN 'Reboot Pending'
ELSE cast(ogm.CurrentState as nvarchar)
END as 'CurrentStateName'
FROM [dbo].[vSMS_OrchestrationGroupMembers] OGM
INNER JOIN vSMS_OrchestrationGroup og
on og.MOG_UniqueID=ogm.MOG_UniqueID
INNER JOIN [dbo].[v_Site] s
on S.SiteCode = OGM.SiteCode
)
SELECT
GroupName
,[SiteCode]
,[IsActive]
,[MOGID]
,[MOG_UniqueID]
,[CurrentState]
,[StateCode]
,[LockAcquiredTime]
,ServerName
,STRING_AGG((cast([ResourceID]as nvarchar(10))+'-'+[name]),',')WITHIN GROUP ( ORDER BY SequenceNumber) 'Resourceids'
FROM CTE
WHERE CurrentState =4
GROUP BY GroupName
,[SiteCode]
,[IsActive]
,[MOGID]
,[MOG_UniqueID]
,[CurrentState]
,[StateCode]
,[LockAcquiredTime]
,ServerName
"
$FailedDevices = Invoke-Sqlcmd -Database $MEMCMDB -ServerInstance $MEMCMServer -Query $query
foreach($FailedDev in $FailedDevices){
New-PSDrive -Name $FailedDev.SiteCode -PSProvider CMSite -Root $FailedDev.ServerName
Push-Location "$($FailedDev.SiteCode):\"
$OrchstrationClass = Get-WmiObject -ComputerName $FailedDev.ServerName -Namespace "Root\SMS\SITE_$($FailedDev.SiteCode)" -ClassName SMS_MachineOrchestrationGroup -list
foreach($System in $FailedDev.Resourceids.split(',')){
$ResourceID = $system.split('-')[0]
$Name = $system.split('-')[1]
Write-Output -InputObject "Fixing $Name"
$OrchstrationClass.ResetMOGMember($ResourceID);
}
Get-CMOrchestrationGroup -Name $Faileddev.GroupName | Invoke-CMOrchestrationGroup -IgnoreServiceWindow $true
Pop-Location
}