views:

97

answers:

1

Hi I am trying to create a VB.NET application which will (hopefully) reduce some time spent on some of my departments helpdesk calls. The part that I am stuck with is how to use VB.NET to remove a user from a group. The following is code that I have been playing with:

Public Shared Sub RemoveUserFromGroup(ByVal deUser As String, ByVal GroupName As String)
    Dim entry As DirectoryEntry = ADEntry()
    Dim mySearcher As DirectorySearcher = New DirectorySearcher(entry)

    mySearcher.Filter = "(&(ObjectClass=Group)(CN=" & GroupName & "))"
    mySearcher.PropertiesToLoad.Add("OrganizationalUnit")
    mySearcher.PropertiesToLoad.Add("DistinguishedName")
    mySearcher.PropertiesToLoad.Add("sAMAccountName")

    Dim searchResults As SearchResultCollection = mySearcher.FindAll()
    If searchResults.Count > 0 Then
        Dim group As New DirectoryEntry(searchResults(0).Path)
        Dim members As Object = group.Invoke("Members", Nothing)
        For Each member As Object In CType(members, IEnumerable)
            Dim x As DirectoryEntry = New DirectoryEntry(member)
            MessageBox.Show(x.Properties("sAMAccountName").Value)
            If x.Properties("sAMAccountName").Value = deUser Then
                MessageBox.Show(searchResults.Item(0).Path.ToString)
                MessageBox.Show(x.Properties("sAMAccountName").Value)
                'group.Invoke("Remove", New Object() {x.Properties("OrganizationalUnit").Value})
                group.Properties("member").Remove(x.Properties("OrganizationalUnit").Value)
            End If

        Next
    End If

When I run the program, I recevie a COMException was unhandled, unspecified error at the group.properties line. When using group.invoke I receive the error TargetInvocationException was unhandled.

My aim is to pass as a string the username (sAMAccountName) and the groupname (sAMAccountName) to the function which will locate the user and remove them from the group.

I am new to VB.NET and would appreciate any assistance people can provide.

I am coding in .NET 2.0 as I am unsure if the server it will live on will have 3.5 installed.

Thanks,

Matt

+1  A: 

Well the error message 0x80004005 E_FAIL Unspecified failure is not very helpful. I often get frustrated when working with Active Directory.

Try changing line:

group.Properties("member").Remove(x.Properties("OrganizationalUnit").Value)

to

group.Invoke("Remove", New Object() {x.Path.ToString()})

If you need more reference take a look at this article on VB.net Heaven by Erika Ehrli. The article covers various use cases with Active Directory.

I hope that helps.

Shiftbit
using x.path.tostring() worked perfectly. After many days and countless variations of code it is great to have finally finished this small aspect of the code. Thanks very much for providing your assistance, it is always greatly appreciated.
Lima
You're welcome. I understand the frustration of Active Directory and COM.
Shiftbit