1
+ ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
2
+ '
3
+ ' Get-ADSPNAudit.vbs
4
+ ' Copyright FineBuild Team © 2021. Distributed under Ms-Pl License
5
+ '
6
+ ' Purpose: Displays SPN and AllowedToDelegateTo information for AD accounts
7
+ '
8
+ ' Author: Ed Vassie
9
+ '
10
+ ' Date: December 2021
11
+ '
12
+ ' Change History
13
+ ' Version Author Date Description
14
+ ' 1.0 Ed Vassie 10 Dec 2021 Initial version
15
+ '
16
+ '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
17
+ Option Explicit
18
+ On Error Goto 0
19
+
20
+ Dim objCommand, objConnection, objNetwork, objRecordSet, objRootDSE
21
+ Dim strDomainDN
22
+
23
+ Call Init()
24
+ Call Process()
25
+ Call Terminate()
26
+
27
+ Sub Init()
28
+
29
+ Set objNetwork = CreateObject( "WScript.Network" )
30
+ Set objRootDSE = GetObject ( "LDAP://" & objNetwork.UserDomain & "/RootDSE" )
31
+ strDomainDN = objRootDSE.Get( "DefaultNamingContext" )
32
+
33
+ Set objConnection = CreateObject( "ADODB.Connection" )
34
+ objConnection.Provider = "ADsDSOObject"
35
+ objConnection.Open "Active Directory Provider"
36
+
37
+ Set objCommand = CreateObject( "ADODB.Command" )
38
+ objCommand.ActiveConnection = objConnection
39
+ objCommand.Properties( "Searchscope" ) = 2 ' SUBTREE
40
+ objCommand.Properties( "Page Size" ) = 250
41
+ objCommand.Properties( "Timeout" ) = 30
42
+ objCommand.Properties( "Cache Results" ) = False
43
+ objCommand.Properties( "Sort on" ) = "Name"
44
+ objCommand.CommandText = "SELECT ADsPath FROM 'LDAP://" & strDomainDN & "'"
45
+ Set objRecordSet = objCommand.Execute
46
+
47
+ wscript.echo "-- SPN Audit Report --"
48
+
49
+ End Sub
50
+
51
+
52
+ Sub Process()
53
+
54
+ On Error Resume Next
55
+
56
+ Do While Not objRecordSet.EOF
57
+ If objRecordSet.Fields( "Name" ) <> "" Then
58
+ Call ProcessAccount(objRecordSet.Fields( "ADsPath" ).Value)
59
+ End If
60
+ objRecordSet.MoveNext
61
+ Loop
62
+
63
+ End Sub
64
+
65
+
66
+ Sub ProcessAccount(strADsPath)
67
+ Dim objAccount, objACE, objAttr, objDACL
68
+ Dim strAttr, strMsg
69
+
70
+ On Error Resume Next
71
+
72
+ Set objAccount = GetObject(strADsPath)
73
+ strMsg = Mid(objAccount.Name, 4 )
74
+ If strMsg = "" Then
75
+ Exit Sub
76
+ End If
77
+
78
+ Select Case True
79
+ Case IsNull(objAccount.Get( "msDS-ManagedPasswordId" ))
80
+ ' Nothing, Account is not a gMSA
81
+ Case IsNull(objAccount.Get( "msDS-GroupMSAMembership" ))
82
+ strMsg = strMsg & vbCrLf & " WARNING: No Group details for gMSA Account"
83
+ Case Else
84
+ strMsg = strMsg & vbCrLf & " gMSA Group Details:"
85
+ Set objAttr = objAccount.Get( "msDS-GroupMSAMembership" )
86
+ Set objDACL = objAttr.DiscretionaryAcl
87
+ For Each objACE In objDACL
88
+ strMsg = strMsg & vbCRLF & " " & objACE.Trustee
89
+ Next
90
+ End Select
91
+
92
+ Select Case True
93
+ Case IsNull(objAccount.Get( "servicePrincipalName" ))
94
+ ' Nothing, no SPN definitions for Account
95
+ Case Else
96
+ strMsg = strMsg & vbCrLf & " SPN Details:"
97
+ objAttr = objAccount.Get( "servicePrincipalName" )
98
+ For Each strAttr In objAttr
99
+ strMsg = strMsg & vbCRLF & " " & strAttr
100
+ Next
101
+ End Select
102
+
103
+ Select Case True
104
+ Case IsNull(objAccount.Get( "msDS-AllowedToDelegateTo" ))
105
+ ' Nothing, no SPN Usage for Account
106
+ Case Else
107
+ strMsg = strMsg & vbCrLf & " Delegation Details:"
108
+ objAttr = objAccount.Get( "msDS-AllowedToDelegateTo" )
109
+ For Each strAttr In objAttr
110
+ strMsg = strMsg & vbCRLF & " " & strAttr
111
+ Next
112
+ End Select
113
+
114
+ If strMsg <> Mid(objAccount.Name, 4 ) Then
115
+ Wscript.Echo " "
116
+ Wscript.Echo strMsg
117
+ End If
118
+
119
+ End Sub
120
+
121
+
122
+ Sub Terminate()
123
+
124
+ objRecordset.Close
125
+ objConnection.Close
126
+
127
+ wscript.echo vbCrLf & "-- End of Report --"
128
+
129
+ wscript.quit 0
130
+
131
+ End Sub
132
+
0 commit comments