英文:
Excel VBA: how to find a description from an AD-group
问题
我已经浏览了这个网站很多次以寻找答案,这是我的第一个问题。这里有一个很棒的社区!
为了一个项目,我需要制作一个Excel表格,根据当前的Active Directory组来建议新的Active Directory组。为此,我需要当前Active Directory组的描述字段(这是我们组织中的强制字段)。
所以我已经有一个可以通过将其标记为颜色来验证组存在性的脚本。这只是一个多步问题的第一步。这并不会检索描述信息。到目前为止,我在互联网上也没有找到一个我理解的有效解决方案。
使问题更复杂的可能是这些组位于不同的容器中,这使得区分名称前缀不一致。
任何帮助将不胜感激。
Jeroen
到目前为止的代码。这会从D列(从D2开始)读取AD组,然后在Active Directory中搜索它。然后,如果找到了组,它会用绿色标记一个单元格。
Sub ValidateGroupName()
Dim objController
Dim objGCController
Dim objConnection
Dim objCommand
Dim strADPath
Dim objRecordSet
Dim objFields
Dim Y As Integer
Dim GroupName As String
Dim ActSheet As String
Dim Descriptionname As String
ActSheet = ActiveSheet.Name
' 设置AD连接
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
Set objController = GetObject("GC:")
' 从AD获取记录
For Each objGCController In objController
strADPath = objGCController.ADspath
Next
Y = 0
Do
GroupName = Sheets(ActSheet).Range("D2").Offset(Y, 0).Value
objCommand.CommandText = _
"<" & strADPath & ">;(&(objectClass=Group)" & _
"(cn=" & GroupName & "));distinguishedName;subtree"
objCommand.Properties("Page Size") = 50000
Set objRecordSet = objCommand.Execute
' 对结果采取什么措施?
If objRecordSet.RecordCount = 0 Then
' 将单元格颜色更改为红色
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 255
Else
' 将单元格颜色更改为绿色
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 7138816
End If
Y = Y + 1
Loop Until Sheets(ActSheet).Range("D2").Offset(Y, 0).Value = ""
' 关闭AD连接
objConnection.Close
End Sub
希望我走在正确的道路上,但也许有不同的方法可以提供更清洁的解决方案。
英文:
I've browsed this site many times for answers and this is my first question. Great community here!
For a project I need to make an Excel sheet that suggests new Active directory groups based on their current active directory groups. For this I need the description field of the current active directory group (this is a mandatory field in our organization).
So I already have a script that can verify the existence of a Group by marking it with a colour. It's only 1 step of a multi step problem.
This doesn't retrieve the description information. And I have not found a working solution on the internet so far that I also understood.
A problem that might make it more complex is that the groups are in different Containers. This make the distinguished name prefix inconsistent.
Any help would be welcome.
Jeroen
Code so far. This reads ADgroups from column D (starting with D2) and searches it in active directory. Then it marks a cell with the colour green if it was found.
Sub ValidateGroupName()
Dim objController
Dim objGCController
Dim objConnection
Dim objCommand
Dim strADPath
Dim objRecordSet
Dim objFields
Dim Y As Integer
Dim GroupName As String
Dim ActSheet As String
Dim Descriptionname As String
ActSheet = ActiveSheet.Name
' Set up AD connection
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=ADsDSOObject;"
Set objCommand = CreateObject("ADODB.Command")
objCommand.ActiveConnection = objConnection
Set objController = GetObject("GC:")
' Get record from AD
For Each objGCController In objController
strADPath = objGCController.ADspath
'strADDescription = objGCController.ADspath
Next
Y = 0
Do
GroupName = Sheets(ActSheet).Range("D2").Offset(Y, 0).Value
objCommand.CommandText = _
"<" & strADPath & ">;(&(objectClass=Group)" & _
"(cn=" & GroupName & "));distinguishedName;subtree"
objCommand.Properties("Page Size") = 50000
Set objRecordSet = objCommand.Execute
' What to do with results?
If objRecordSet.RecordCount = 0 Then
'change color of a cell to red
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 255
Else
' change color of a cell to green
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 7138816
End If
Y = Y + 1
Loop Until Sheets(ActSheet).Range("D2").Offset(Y, 0).Value = ""
' Close AD connection
objConnection.Close
End Sub
I hope I'm on the right track, but a different approach might be a cleaner solution.
答案1
得分: 0
第一步,将 'description' 属性添加到您的查询中:
objCommand.CommandText = _
"<" & strADPath & ">;(&(objectClass=Group)" & _
"(cn=" & GroupName & "));distinguishedName;subtree;Description"
第二步,如果群组存在,则获取属性值,并将其写在群组单元格旁边,例如:
If objRecordSet.RecordCount = 0 Then
'将单元格颜色更改为红色
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 255
Else
'将单元格颜色更改为绿色
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 7138816
Sheets(ActSheet).Range("E2").Offset(Y, 1).Text = objRecordset.Fields("Description")
End If
英文:
first, add 'description' property to your query :
objCommand.CommandText = _
"<" & strADPath & ">;(&(objectClass=Group)" & _
"(cn=" & GroupName & "));distinguishedName;subtree;Description"
second, get property value if group exist and write it beside group cell for example :
If objRecordSet.RecordCount = 0 Then
'change color of a cell to red
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 255
Else
' change color of a cell to green
Sheets(ActSheet).Range("E2").Offset(Y, 0).Interior.Color = 7138816
Sheets(ActSheet).Range("E2").Offset(Y, 1).text = objRecordset.Fields("Description")
End If
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论