forked from Skatterbrainz/sccm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Compare-ListToCmCollection.ps1
113 lines (111 loc) · 4.17 KB
/
Compare-ListToCmCollection.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
[CmdletBindint()
param (
[parameter(Mandatory=$False, HelpMessage="File containing computer names")]
[string] $ListFile = "",
[parameter(Mandatory=$False, HelpMessage="ConfigMgr CollectionID")]
[string] $CollectionID = "",
[parameter(Mandatory=$False, HelpMessage="Path to computer list files")]
[ValidateNotNullOrEmpty()]
[string] $InputFilesPath = ".\lists",
[parameter(Mandatory=$False, HelpMessge="ConfigMgr SQL Server host name")]
[ValidateNotNullOrEmpty()]
[string] $ServerName = "cm01.contoso.local",
[parameter(Mandatory=$False, HelpMessage="ConfigMgr site code")]
[ValidateNotNullOrEmpty()]
[string] $SiteCode = "P01",
[parameter(Mandatory=$False, HelpMessage="Show total relative counts only")]
[switch] $Summary,
[parameter(Mandatory=$False, HelpMessage="Show extended AD and ConfigMgr data for each device")]
[switch] $Detailed
)
if ([string]::IsNullOrEmpty($ListFile)) {
$ListFile = Get-ChildItem -Path $InputFilesPath -Filter "*.txt" | Out-GridView -Title "Select File to Process" -OutputMode Single
if (!$ListFile) { break }
Write-Host "$ListFile" -ForegroundColor Cyan
$filepath = $ListFile.FullName
$filename = $ListFile.BaseName
}
else {
Write-Host "reading list file: $ListFile" -ForegroundColor Cyan
$x = Get-Item -Path $ListFile
$filepath = $x.FullName
$filename = $x.BaseName
}
$fileMembers = Get-Content -Path $filepath
if ([string]::IsNullOrEmpty($CollectionID)) {
$collData = .\tools\Get-CmCollectionMember.ps1 -ServerName $ServerName -SiteCode $SiteCode -Choose
}
else {
$collData = .\tools\Get-CmCollectionMember.ps1 -CollectionID $CollectionID -ServerName $ServerName -SiteCode $SiteCode
}
$collmembers = $collData | Select -ExpandProperty ComputerName
if ($Summary) {
Write-Host "collection members: $($collmembers.Count)"
Write-Host "file list members: $($fileMembers.Count)"
}
else {
$result = @()
$rownum = 1
foreach ($fm in $fileMembers) {
if ($collmembers -contains $fm) {
$ismember = $True
}
else {
$ismember = $False
}
if ($Detailed) {
$adlogin = .\tools\Get-ADsComputers.ps1 -ComputerName $fm | Select -ExpandProperty LastLogon
$cmdata = .\tools\Get-CMDeviceInfo.ps1 -ServerName $ServerName -SiteCode $SiteCode -ComputerNames $fm
$props1 = [ordered]@{
ComputerName = $fm
RowID = $rownum
FileMember = $True
CollMember = $ismember
ADLastLogin = $adlogin
CMClient = $cmdata.ClientVersion
CMHwScan = $cmdata.LastHwScan
}
}
else {
$props1 = [ordered]@{
ComputerName = $fm
RowID = $rownum
FileMember = $True
CollMember = $ismember
}
}
$result += $(New-Object PSObject -Property $props1)
$rownum++
}
foreach ($cm in $collmembers) {
if ($Detailed) {
$adlogin = .\tools\Get-ADsComputers.ps1 -ComputerName $cm | Select -ExpandProperty LastLogon
$cmdata = .\tools\Get-CMDeviceInfo.ps1 -ServerName $ServerName -SiteCode $SiteCode -ComputerNames $cm
if ($fileMembers -notcontains $cm) {
$props2 = [ordered]@{
ComputerName = $cm
RowID = $rownum
FileMember = $False
CollMember = $True
ADLastLogin = $adlogin
CMClient = $cmdata.ClientVersion
CMHwScan = $cmdata.LastHwScan
}
$result += $(New-Object PSObject -Property $props2)
}
}
else {
if ($fileMembers -notcontains $cm) {
$props2 = [ordered]@{
ComputerName = $cm
RowID = $rownum
FileMember = $False
CollMember = $True
}
$result += $(New-Object PSObject -Property $props2)
}
}
$rownum++
}
$result
}