-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAD GPO Linker Utility.Run.ps1
4231 lines (4060 loc) · 249 KB
/
AD GPO Linker Utility.Run.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#------------------------------------------------------------------------
# Source File Information (DO NOT MODIFY)
# Source ID: b7cbd6b9-de91-4fc0-9837-5d98d557cb84
# Source File: C:\Users\cdr95985.AD\git\AD GPO Linker Utility\AD GPO Linker Utility.psproj
#------------------------------------------------------------------------
<#
.NOTES
--------------------------------------------------------------------------------
Code generated by: SAPIEN Technologies, Inc., PowerShell Studio 2018 v5.5.154
Generated on: 4/14/2020 6:56 PM
Generated by: cdr95985
--------------------------------------------------------------------------------
.DESCRIPTION
Script generated by PowerShell Studio 2018
#>
#region Source: Startup.pss
#----------------------------------------------
#region Import Assemblies
#----------------------------------------------
#endregion Import Assemblies
#Define a Param block to use custom parameters in the project
#Param ($CustomParameter)
function Main {
<#
.SYNOPSIS
The Main function starts the project application.
.PARAMETER Commandline
$Commandline contains the complete argument string passed to the script packager executable.
.NOTES
Use this function to initialize your script and to call GUI forms.
.NOTES
To get the console output in the Packager (Forms Engine) use:
$ConsoleOutput (Type: System.Collections.ArrayList)
#>
Param ([String]$Commandline)
#--------------------------------------------------------------------------
#TODO: Add initialization script here (Load modules and check requirements)
#--------------------------------------------------------------------------
if((Show-MainForm_psf) -eq 'OK')
{
}
$script:ExitCode = 0 #Set the exit code for the Packager
}
#endregion Source: Startup.pss
#region Source: Globals.ps1
#--------------------------------------------
# Declare Global Variables and Functions here
#--------------------------------------------
#Sample function that provides the location of the script
function Get-ScriptDirectory
{
<#
.SYNOPSIS
Get-ScriptDirectory returns the proper location of the script.
.OUTPUTS
System.String
.NOTES
Returns the correct path within a packaged executable.
#>
[OutputType([string])]
param ()
if ($null -ne $hostinvocation)
{
Split-Path $hostinvocation.MyCommand.path
}
else
{
Split-Path $script:MyInvocation.MyCommand.Path
}
}
function Add-ToTreeView
{
[cmdletbinding()]
Param (
[Parameter(Mandatory = $true)]
[System.Array]$ArrayOfObjects,
[Parameter(Mandatory = $true)]
[System.String]$DisplayMember,
[Parameter(Mandatory = $false)]
[System.Object]$DisplayFunction,
[Parameter(Mandatory = $true)]
[System.Windows.Forms.TreeView]$TreeView,
[Parameter(Mandatory = $true)]
[System.Collections.Hashtable]$CheckedNodes,
[Parameter(Mandatory = $false)]
[System.String]$Filter,
[Parameter(Mandatory = $false)]
[System.String]$MemberToFilterOn
)
# for each gpo
$ArrayOfObjects | %{
if ($DisplayFunction)
{
# don't forget the quotes around displaymember so powershell doesn't convert it into an array by default (fn expects string))
$name = (Invoke-Expression "$DisplayFunction '$($_.$DisplayMember)'")
#Write-Debug ("Invoke: $DisplayFunction $($_.$DisplayMember)")
#Write-Debug "`t yielded: $name"
$node = New-Object -TypeName System.Windows.Forms.TreeNode -ArgumentList "$name"
}
else
{
$node = New-Object -TypeName System.Windows.Forms.TreeNode -ArgumentList $_.$DisplayMember
}
# ref this object in the tag property
$node.Tag = $_
# if it was previously in the checked items list, check it again (if re-adding the node to the tree...)
if ($CheckedNodes -and $CheckedNodes[$_.Id])
{
$node.Checked = $true
}
# add it to the tree view
if ($Filter)
{
Write-Debug "Match $($_.$MemberToFilterOn) -like $Filter"
if ($_.$MemberToFilterOn -like "*$Filter*")
{
$TreeView.Nodes.Add($node)
}
}
else
{
$TreeView.Nodes.Add($node)
}
}
}
function Get-CanonicalName ([string[]]$DistinguishedName)
{
foreach ($dn in $DistinguishedName)
{
$d = $dn.Split(',') ## Split the dn string up into it's constituent parts
$arr = (@(($d | Where-Object { $_ -notmatch 'DC=' }) | ForEach-Object { $_.Substring(3) })) ## get parts excluding the parts relevant to the FQDN and trim off the dn syntax
[array]::Reverse($arr) ## Flip the order of the array.
## Create and return the string representation in canonical name format of the supplied DN
"{0}/{1}" -f (($d | Where-Object { $_ -match 'dc=' } | ForEach-Object { $_.Replace('DC=', '') }) -join '.'), ($arr -join '/')
}
}
function Get-CheckedNode
{
<#
.SYNOPSIS
This function collects a list of checked nodes in a TreeView
.DESCRIPTION
This function collects a list of checked nodes in a TreeView
.PARAMETER $NodeCollection
The collection of nodes to search
.PARAMETER $CheckedNodes
The ArrayList that will contain the all the checked items
.EXAMPLE
$CheckedNodes = New-Object System.Collections.ArrayList
Get-CheckedNode $treeview1.Nodes $CheckedNodes
foreach($node in $CheckedNodes)
{
Write-Host $node.Text
}
#>
param (
[ValidateNotNull()]
[System.Windows.Forms.TreeNodeCollection]$NodeCollection,
[ValidateNotNull()]
[System.Collections.ArrayList]$CheckedNodes
)
foreach ($Node in $NodeCollection)
{
if ($Node.Checked)
{
[void]$CheckedNodes.Add($Node)
}
Get-CheckedNode $Node.Nodes $CheckedNodes
}
}
#Sample variable that provides the location of the script
[string]$ScriptDirectory = Get-ScriptDirectory
$script:version = "v0.1"
#endregion Source: Globals.ps1
#region Source: MainForm.psf
function Show-MainForm_psf
{
#----------------------------------------------
#region Import the Assemblies
#----------------------------------------------
[void][reflection.assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[void][reflection.assembly]::Load('System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][reflection.assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
#endregion Import Assemblies
#----------------------------------------------
#region Generated Form Objects
#----------------------------------------------
[System.Windows.Forms.Application]::EnableVisualStyles()
$formADGPOLinkerUtility = New-Object 'System.Windows.Forms.Form'
$statusstrip1 = New-Object 'System.Windows.Forms.StatusStrip'
$splitcontainer1 = New-Object 'System.Windows.Forms.SplitContainer'
$buttonExit = New-Object 'System.Windows.Forms.Button'
$menustrip1 = New-Object 'System.Windows.Forms.MenuStrip'
$tv_groupPolicies = New-Object 'System.Windows.Forms.TreeView'
$aboutToolStripMenuItem = New-Object 'System.Windows.Forms.ToolStripMenuItem'
$labelSelectedGPOIsLinkedT = New-Object 'System.Windows.Forms.Label'
$buttonGetSelectedGpoReport = New-Object 'System.Windows.Forms.Button'
$rtb_selectedGpoLinks = New-Object 'System.Windows.Forms.RichTextBox'
$buttonGetCheckedGpoReports = New-Object 'System.Windows.Forms.Button'
$rtb_checkedGpoLinks = New-Object 'System.Windows.Forms.RichTextBox'
$labelCheckedGPOsAreLinked = New-Object 'System.Windows.Forms.Label'
$tb_filterGroupPolicies = New-Object 'System.Windows.Forms.TextBox'
$buttonFilter = New-Object 'System.Windows.Forms.Button'
$buttonUncheckAll = New-Object 'System.Windows.Forms.Button'
$tooltip1 = New-Object 'System.Windows.Forms.ToolTip'
$buttonClearFilter = New-Object 'System.Windows.Forms.Button'
$linkCheckedGPOsToolStripMenuItem = New-Object 'System.Windows.Forms.ToolStripMenuItem'
$toolstripstatuslabel1 = New-Object 'System.Windows.Forms.ToolStripStatusLabel'
$toolstripstatuslabel2 = New-Object 'System.Windows.Forms.ToolStripStatusLabel'
$InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
#endregion Generated Form Objects
#----------------------------------------------
# User Generated Script
#----------------------------------------------
<#
Bugs:
- If you check a box too fast, the gpo may/may not appear as expected in the rich text box that displays the links
#>
$formADGPOLinkerUtility_Load = {
$formADGPOLinkerUtility.Text = "$($formADGPOLinkerUtility.Text) $script:version"
# https://docs.microsoft.com/en-us/previous-versions/windows/desktop/wmi_v2/class-library/gpo-class-microsoft-grouppolicy
$script:gpos = Get-GPO -All | Sort-Object -Property DisplayName
$script:checkedGpos = @{}
# Empty array to hold all possible GPO links
$script:gPLinks = @()
# GPOs linked to the root of the domain
# !!! Get-ADDomain does not return the gPLink attribute
$script:gPLinks += Get-ADObject -Identity (Get-ADDomain).distinguishedName -Properties name, canonicalName, distinguishedName, gPLink, gPOptions, ObjectGuid
# GPOs linked to OUs
# !!! Get-GPO does not return the gPLink attribute
$script:gPLinks += Get-ADOrganizationalUnit -Filter * -Properties name, canonicalName, distinguishedName, gPLink, gPOptions, ObjectGuid
# GPOs linked to sites
$script:gPLinks += Get-ADObject -LDAPFilter '(objectClass=site)' `
-SearchBase "CN=Sites,$((Get-ADRootDSE).configurationNamingContext)" `
-SearchScope OneLevel -Properties name, canonicalName, distinguishedName, gPLink, gPOptions, ObjectGuid
# sort
$script:gPLinks = $script:gPLinks | Sort-Object -Property canonicalName
Add-ToTreeView -ArrayOfObjects $script:gpos -DisplayMember "DisplayName" -TreeView $tv_groupPolicies -CheckedNodes $script:checkedGpos
}
$formADGPOLinkerUtility_Shown = {
$tb_filterGroupPolicies.Focus()
}
$tv_groupPolicies_AfterSelect=[System.Windows.Forms.TreeViewEventHandler]{
$buttonGetSelectedGpoReport.Enabled = $true
#Event Argument: $_ = [System.Windows.Forms.TreeViewEventArgs]
$rtb_selectedGpoLinks.Clear()
$gpo = $tv_groupPolicies.SelectedNode.Tag
# if there is a gpo object assigned to it
if ($gpo)
{
# print it
$rtb_selectedGpoLinks.Lines += $gpo.DisplayName
# check if any OU / SITE / CONTAINER ETC. contains a link to this gpo
$script:gPLinks | %{
$container = $_
# parse the links on this container
for ($i = 0; $i -lt $container.LinkedGroupPolicyObjects.count; $i++)
{
$link = $container.LinkedGroupPolicyObjects[$i]
# if this gpo is linked to this container
if ($link -match $gpo.Id)
{
# print it as such
Write-Debug "`t$(Get-CanonicalName -DistinguishedName $container.DistinguishedName)"
$rtb_selectedGpoLinks.Lines += "`t$(Get-CanonicalName -DistinguishedName $container.DistinguishedName)"
break
}
}
} # end for each gpo link
$rtb_selectedGpoLinks.Lines += [System.Environment]::NewLine
} # end if gpo
}
$tv_groupPolicies_AfterCheck=[System.Windows.Forms.TreeViewEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.TreeViewEventArgs]
$rtb_checkedGpoLinks.Clear()
# remove unchecked item from our cache
if (!$_.Node.Checked -and $_.Node.Tag)
{
Write-Debug "Unchecked $($_.Node)"
$script:checkedGpos.Remove($_.Node.Tag.Id)
}
# add this node to the cache
if ($_.Node.Checked)
{
if ($_.Node.Tag -and $_.Node.Tag.Id)
{
Write-Debug "`t$($_.Node.Tag.DisplayName)"
$script:checkedGpos[$_.Node.Tag.Id] = $_.Node
}
else
{
Write-Warning "A GPO was selected from the Tree View, but it was not applied to the TreeViewNode.Tag property. It will not be added to 'checked nodes'"
}
}
Write-Debug "Total nodes checked: $($script:checkedGpos.count)"
$toolstripstatuslabel2.Text = "Selected $($script:checkedGpos.count) group policy object(s)"
# for each checked node
$script:checkedGpos.Keys | %{
$gpoId = $_ # the key in the hash is the gpo id...
$gpo = $script:checkedGpos[$gpoId].Tag
# if there is a gpo object assigned to it
if ($gpo)
{
# print it
$rtb_checkedGpoLinks.Lines += $gpo.DisplayName
# check if any OU / SITE / CONTAINER ETC. contains a link to this gpo
$script:gPLinks | %{
$container = $_
# parse the links on this container
for ($i = 0; $i -lt $container.LinkedGroupPolicyObjects.count; $i++)
{
$link = $container.LinkedGroupPolicyObjects[$i]
# if this gpo is linked to this container
if ($link -match $gpoId)
{
# print it as such
Write-Debug "`t$(Get-CanonicalName -DistinguishedName $container.DistinguishedName)"
$rtb_checkedGpoLinks.Lines += "`t$(Get-CanonicalName -DistinguishedName $container.DistinguishedName)"
break
}
}
} # end for each gpo link
$rtb_checkedGpoLinks.Lines += [System.Environment]::NewLine
} # end if gpo
else
{
Write-Warning "Attempted to load a GPO from a checked object, but there was none found; skipping..."
}
} # end for each checked gpo
# enable the button report button for multiple gpos
$buttonGetCheckedGpoReports.Enabled = $script:checkedGpos.Count -gt 0
}
$buttonGetSelectedGpoReport_Click = {
$gpo = $tv_groupPolicies.SelectedNode.Tag
Write-Debug "Should fetch report for GPO: $($gpo.DisplayName)"
if ($gpo)
{
$outputPath = (Join-Path -Path (Get-ScriptDirectory) -ChildPath "$($gpo.DisplayName).html")
Write-Debug "Writing report to: $outputPath"
Get-GPOReport -Guid $gpo.Id -ReportType HTML -Path $outputPath
Write-Debug "Invoking item: $outputPath"
Invoke-Item -Path $outputPath
}
else
{
[System.Windows.Forms.MessageBox]::Show("You must select (not check) a GPO in order to view its report", "Error")
}
}
$buttonGetCheckedGpoReports_Click={
# foreach checked node
$i = 0
$script:checkedGpos.Keys | %{
$gpoId = $_ # the key in the hash is the gpo id...
$gpo = $script:checkedGpos[$gpoId].Tag
Write-Debug "Should fetch report for GPO: $($gpo.DisplayName) ($gpoId)"
if ($gpo)
{
$outputPath = (Join-Path -Path (Get-ScriptDirectory) -ChildPath "$($gpo.DisplayName).html")
Write-Debug "Writing report to: $outputPath"
Get-GPOReport -Guid $gpo.Id -ReportType HTML -Path $outputPath
Write-Debug "Invoking item: $outputPath"
Invoke-Item -Path $outputPath
}
$i++
}
if ($i -eq 0)
{
[System.Windows.Forms.MessageBox]::Show("You must check some GPOs in order to view their reports", "Error")
}
}
$aboutToolStripMenuItem_Click={
#TODO: Place custom script here
if ((Show-AboutForm_psf) -eq 'OK')
{
}
}
#endregion
$buttonFilter_Click={
if ([String]::IsNullOrEmpty($tb_filterGroupPolicies.Text))
{
# show all nodes
Write-Debug "Show all nodes"
$tv_groupPolicies.Nodes.Clear()
Add-ToTreeView -ArrayOfObjects $script:gpos -DisplayMember "DisplayName" -TreeView $tv_groupPolicies -CheckedNodes $script:checkedGpos
}
else
{
Write-Debug "Filter nodes on -like '$($tb_filterGroupPolicies.Text)'"
# show matching nodes (wild card)
$tv_groupPolicies.Nodes.Clear()
Add-ToTreeView -ArrayOfObjects $script:gpos -DisplayMember "DisplayName" -TreeView $tv_groupPolicies -CheckedNodes $script:checkedGpos -Filter $tb_filterGroupPolicies.Text -MemberToFilterOn "DisplayName"
}
if ($tv_groupPolicies.Nodes.Count -eq 0)
{
$toolstripstatuslabel1.Text = "No results found for '*$($tb_filterGroupPolicies.Text)*'"
}
else
{
$toolstripstatuslabel1.Text = "$($tv_groupPolicies.Nodes.Count) result(s) found for '*$($tb_filterGroupPolicies.Text)*'"
}
}
$buttonUncheckAll_Click = {
$checkedNodes = New-Object System.Collections.ArrayList
Get-CheckedNode -NodeCollection $tv_groupPolicies.Nodes -CheckedNodes $checkedNodes
foreach ($node in $checkedNodes)
{
Write-Debug "unchecking $($_.Name)"
$node.Checked = $false
}
# moving this here from tv_groupPolicies_afterCheck event to fix bug - if you check, then search for a non-matching policy, the original check goes away
$rtb_checkedGpoLinks.Clear()
$script:checkedGpos.Clear()
$toolstripstatuslabel2.Text = ""
}
$buttonClearFilter_Click={
$tb_filterGroupPolicies.Text = ""
$buttonFilter.PerformClick()
}
$linkCheckedGPOsToolStripMenuItem_Click = {
if ($script:checkedGpos.Count)
{
Show-ActiveDirectoryBrowser_psf -GroupPolicyTreeNodes $script:checkedGpos -ActiveDirectoryContainers $script:gPLinks
}
else
{
[System.Windows.Forms.MessageBox]::Show("You must check at least one GPO in order to link / unlink it!", "Error")
}
}
$tb_filterGroupPolicies_KeyDown = [System.Windows.Forms.KeyEventHandler]{
#Event Argument: $_ = [System.Windows.Forms.KeyEventArgs]
#Write-Debug $_.KeyCode
if ($_.KeyCode -eq 'Return')
{
Invoke-Command -ScriptBlock $buttonFilter_Click
}
elseif ($_.KeyCode -eq 'Escape')
{
Invoke-Command -ScriptBlock $buttonClearFilter_Click
}
}
# --End User Generated Script--
#----------------------------------------------
#region Generated Events
#----------------------------------------------
$Form_StateCorrection_Load=
{
#Correct the initial state of the form to prevent the .Net maximized form issue
$formADGPOLinkerUtility.WindowState = $InitialFormWindowState
}
$Form_StoreValues_Closing=
{
#Store the control values
if($tv_groupPolicies.SelectedNode -ne $null)
{
$script:MainForm_tv_groupPolicies = $tv_groupPolicies.SelectedNode.Text
}
else
{
$script:MainForm_tv_groupPolicies = $null
}
$script:MainForm_rtb_selectedGpoLinks = $rtb_selectedGpoLinks.Text
$script:MainForm_rtb_checkedGpoLinks = $rtb_checkedGpoLinks.Text
$script:MainForm_tb_filterGroupPolicies = $tb_filterGroupPolicies.Text
}
$Form_Cleanup_FormClosed=
{
#Remove all event handlers from the controls
try
{
$formADGPOLinkerUtility.remove_Load($formADGPOLinkerUtility_Load)
$formADGPOLinkerUtility.remove_Shown($formADGPOLinkerUtility_Shown)
$tv_groupPolicies.remove_AfterCheck($tv_groupPolicies_AfterCheck)
$tv_groupPolicies.remove_AfterSelect($tv_groupPolicies_AfterSelect)
$aboutToolStripMenuItem.remove_Click($aboutToolStripMenuItem_Click)
$buttonGetSelectedGpoReport.remove_Click($buttonGetSelectedGpoReport_Click)
$buttonGetCheckedGpoReports.remove_Click($buttonGetCheckedGpoReports_Click)
$tb_filterGroupPolicies.remove_KeyDown($tb_filterGroupPolicies_KeyDown)
$buttonFilter.remove_Click($buttonFilter_Click)
$buttonUncheckAll.remove_Click($buttonUncheckAll_Click)
$buttonClearFilter.remove_Click($buttonClearFilter_Click)
$linkCheckedGPOsToolStripMenuItem.remove_Click($linkCheckedGPOsToolStripMenuItem_Click)
$formADGPOLinkerUtility.remove_Load($Form_StateCorrection_Load)
$formADGPOLinkerUtility.remove_Closing($Form_StoreValues_Closing)
$formADGPOLinkerUtility.remove_FormClosed($Form_Cleanup_FormClosed)
}
catch { Out-Null <# Prevent PSScriptAnalyzer warning #> }
}
#endregion Generated Events
#----------------------------------------------
#region Generated Form Code
#----------------------------------------------
$formADGPOLinkerUtility.SuspendLayout()
$splitcontainer1.BeginInit()
$splitcontainer1.SuspendLayout()
$menustrip1.SuspendLayout()
$statusstrip1.SuspendLayout()
#
# formADGPOLinkerUtility
#
$formADGPOLinkerUtility.Controls.Add($statusstrip1)
$formADGPOLinkerUtility.Controls.Add($splitcontainer1)
$formADGPOLinkerUtility.Controls.Add($buttonExit)
$formADGPOLinkerUtility.Controls.Add($menustrip1)
$formADGPOLinkerUtility.AutoScaleDimensions = '8, 17'
$formADGPOLinkerUtility.AutoScaleMode = 'Font'
$formADGPOLinkerUtility.AutoSize = $True
$formADGPOLinkerUtility.ClientSize = '901, 465'
$formADGPOLinkerUtility.MainMenuStrip = $menustrip1
$formADGPOLinkerUtility.Margin = '5, 5, 5, 5'
$formADGPOLinkerUtility.MinimumSize = '919, 512'
$formADGPOLinkerUtility.Name = 'formADGPOLinkerUtility'
$formADGPOLinkerUtility.StartPosition = 'CenterScreen'
$formADGPOLinkerUtility.Text = 'AD GPO Linker Utility'
$formADGPOLinkerUtility.add_Load($formADGPOLinkerUtility_Load)
$formADGPOLinkerUtility.add_Shown($formADGPOLinkerUtility_Shown)
#
# statusstrip1
#
$statusstrip1.ImageScalingSize = '20, 20'
[void]$statusstrip1.Items.Add($toolstripstatuslabel1)
[void]$statusstrip1.Items.Add($toolstripstatuslabel2)
$statusstrip1.Location = '0, 443'
$statusstrip1.Name = 'statusstrip1'
$statusstrip1.Padding = '1, 0, 19, 0'
$statusstrip1.Size = '901, 22'
$statusstrip1.TabIndex = 7
$statusstrip1.Text = 'statusstrip1'
#
# splitcontainer1
#
$splitcontainer1.Dock = 'Fill'
$splitcontainer1.Location = '0, 30'
$splitcontainer1.Margin = '4, 4, 4, 4'
$splitcontainer1.Name = 'splitcontainer1'
[void]$splitcontainer1.Panel1.Controls.Add($buttonClearFilter)
[void]$splitcontainer1.Panel1.Controls.Add($buttonUncheckAll)
[void]$splitcontainer1.Panel1.Controls.Add($buttonFilter)
[void]$splitcontainer1.Panel1.Controls.Add($tb_filterGroupPolicies)
[void]$splitcontainer1.Panel1.Controls.Add($tv_groupPolicies)
$splitcontainer1.Panel1.Padding = '0, 50, 0, 0'
[void]$splitcontainer1.Panel2.Controls.Add($labelCheckedGPOsAreLinked)
[void]$splitcontainer1.Panel2.Controls.Add($labelSelectedGPOIsLinkedT)
[void]$splitcontainer1.Panel2.Controls.Add($buttonGetSelectedGpoReport)
[void]$splitcontainer1.Panel2.Controls.Add($rtb_selectedGpoLinks)
[void]$splitcontainer1.Panel2.Controls.Add($buttonGetCheckedGpoReports)
[void]$splitcontainer1.Panel2.Controls.Add($rtb_checkedGpoLinks)
$splitcontainer1.Panel2.Padding = '0, 50, 0, 0'
$splitcontainer1.Size = '901, 435'
$splitcontainer1.SplitterDistance = 355
$splitcontainer1.SplitterWidth = 5
$splitcontainer1.TabIndex = 5
#
# buttonExit
#
$buttonExit.DialogResult = 'Cancel'
$buttonExit.Location = '737, 469'
$buttonExit.Margin = '4, 4, 4, 4'
$buttonExit.Name = 'buttonExit'
$buttonExit.Size = '100, 30'
$buttonExit.TabIndex = 2
$buttonExit.Text = 'E&xit'
$buttonExit.UseCompatibleTextRendering = $True
$buttonExit.UseVisualStyleBackColor = $True
#
# menustrip1
#
$menustrip1.ImageScalingSize = '20, 20'
[void]$menustrip1.Items.Add($aboutToolStripMenuItem)
[void]$menustrip1.Items.Add($linkCheckedGPOsToolStripMenuItem)
$menustrip1.Location = '0, 0'
$menustrip1.Name = 'menustrip1'
$menustrip1.Padding = '8, 3, 0, 3'
$menustrip1.Size = '901, 30'
$menustrip1.TabIndex = 0
$menustrip1.Text = 'menustrip1'
#
# tv_groupPolicies
#
$tv_groupPolicies.CheckBoxes = $True
$tv_groupPolicies.Dock = 'Fill'
$tv_groupPolicies.Location = '0, 50'
$tv_groupPolicies.Margin = '5, 5, 5, 5'
$tv_groupPolicies.Name = 'tv_groupPolicies'
$tv_groupPolicies.Size = '355, 385'
$tv_groupPolicies.TabIndex = 4
$tv_groupPolicies.add_AfterCheck($tv_groupPolicies_AfterCheck)
$tv_groupPolicies.add_AfterSelect($tv_groupPolicies_AfterSelect)
#
# aboutToolStripMenuItem
#
$aboutToolStripMenuItem.Name = 'aboutToolStripMenuItem'
$aboutToolStripMenuItem.Size = '62, 24'
$aboutToolStripMenuItem.Text = 'About'
$aboutToolStripMenuItem.add_Click($aboutToolStripMenuItem_Click)
#
# labelSelectedGPOIsLinkedT
#
$labelSelectedGPOIsLinkedT.AutoSize = $True
$labelSelectedGPOIsLinkedT.Location = '4, 11'
$labelSelectedGPOIsLinkedT.Margin = '4, 0, 4, 0'
$labelSelectedGPOIsLinkedT.Name = 'labelSelectedGPOIsLinkedT'
$labelSelectedGPOIsLinkedT.Size = '330, 21'
$labelSelectedGPOIsLinkedT.TabIndex = 0
$labelSelectedGPOIsLinkedT.Text = 'Selected GPO is Linked to the following Containers:'
$labelSelectedGPOIsLinkedT.UseCompatibleTextRendering = $True
#
# buttonGetSelectedGpoReport
#
$buttonGetSelectedGpoReport.Anchor = 'Top, Right'
$buttonGetSelectedGpoReport.Enabled = $False
$buttonGetSelectedGpoReport.Location = '437, 4'
$buttonGetSelectedGpoReport.Margin = '4, 4, 4, 4'
$buttonGetSelectedGpoReport.Name = 'buttonGetSelectedGpoReport'
$buttonGetSelectedGpoReport.Size = '100, 30'
$buttonGetSelectedGpoReport.TabIndex = 1
$buttonGetSelectedGpoReport.Text = 'Get Report'
$buttonGetSelectedGpoReport.UseCompatibleTextRendering = $True
$buttonGetSelectedGpoReport.UseVisualStyleBackColor = $True
$buttonGetSelectedGpoReport.add_Click($buttonGetSelectedGpoReport_Click)
#
# rtb_selectedGpoLinks
#
$rtb_selectedGpoLinks.Dock = 'Top'
$rtb_selectedGpoLinks.Location = '0, 50'
$rtb_selectedGpoLinks.Margin = '4, 4, 4, 4'
$rtb_selectedGpoLinks.Name = 'rtb_selectedGpoLinks'
$rtb_selectedGpoLinks.ReadOnly = $True
$rtb_selectedGpoLinks.Size = '541, 160'
$rtb_selectedGpoLinks.TabIndex = 2
$rtb_selectedGpoLinks.Text = ''
#
# buttonGetCheckedGpoReports
#
$buttonGetCheckedGpoReports.Anchor = 'Top, Right'
$buttonGetCheckedGpoReports.Enabled = $False
$buttonGetCheckedGpoReports.Location = '437, 218'
$buttonGetCheckedGpoReports.Margin = '4, 4, 4, 4'
$buttonGetCheckedGpoReports.Name = 'buttonGetCheckedGpoReports'
$buttonGetCheckedGpoReports.Size = '100, 30'
$buttonGetCheckedGpoReports.TabIndex = 4
$buttonGetCheckedGpoReports.Text = 'Get Report(s)'
$buttonGetCheckedGpoReports.UseCompatibleTextRendering = $True
$buttonGetCheckedGpoReports.UseVisualStyleBackColor = $True
$buttonGetCheckedGpoReports.add_Click($buttonGetCheckedGpoReports_Click)
#
# rtb_checkedGpoLinks
#
$rtb_checkedGpoLinks.Dock = 'Bottom'
$rtb_checkedGpoLinks.Location = '0, 256'
$rtb_checkedGpoLinks.Margin = '4, 4, 4, 4'
$rtb_checkedGpoLinks.Name = 'rtb_checkedGpoLinks'
$rtb_checkedGpoLinks.ReadOnly = $True
$rtb_checkedGpoLinks.Size = '541, 179'
$rtb_checkedGpoLinks.TabIndex = 5
$rtb_checkedGpoLinks.Text = ''
#
# labelCheckedGPOsAreLinked
#
$labelCheckedGPOsAreLinked.AutoSize = $True
$labelCheckedGPOsAreLinked.Location = '4, 225'
$labelCheckedGPOsAreLinked.Margin = '4, 0, 4, 0'
$labelCheckedGPOsAreLinked.Name = 'labelCheckedGPOsAreLinked'
$labelCheckedGPOsAreLinked.Size = '347, 21'
$labelCheckedGPOsAreLinked.TabIndex = 3
$labelCheckedGPOsAreLinked.Text = 'Checked GPOs are Linked to the following Containers:'
$labelCheckedGPOsAreLinked.UseCompatibleTextRendering = $True
#
# tb_filterGroupPolicies
#
$tb_filterGroupPolicies.AutoCompleteMode = 'Suggest'
$tb_filterGroupPolicies.AutoCompleteSource = 'CustomSource'
$tb_filterGroupPolicies.Location = '4, 8'
$tb_filterGroupPolicies.Margin = '4, 4, 4, 4'
$tb_filterGroupPolicies.Name = 'tb_filterGroupPolicies'
$tb_filterGroupPolicies.Size = '149, 23'
$tb_filterGroupPolicies.TabIndex = 0
$tooltip1.SetToolTip($tb_filterGroupPolicies, 'Hit ''Enter'' to filter. Hit ''Escape'' to reset the filter.')
$tb_filterGroupPolicies.add_KeyDown($tb_filterGroupPolicies_KeyDown)
#
# buttonFilter
#
$buttonFilter.Anchor = 'Top, Right'
#region Binary Data
$buttonFilter.BackgroundImage = [System.Convert]::FromBase64String('
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