none
Problems with extending s.ds.am.UserPrincipal class RRS feed

  • Question

  • I have been trying to extend the s.ds.am.UserPrincipal class in VS 2010 VB app as I require access to AD User properties that are not by default a part of the UserPrincipal. This is a new concept to me and have run into 2 problems with my extensions that I cannot seem to figure out.

    Thanks in Advance!

    Problem 1: When I attempt to use my UserPrincipalEx to retrieve a user I receive the following error.

    Principal objects of type MyApp.UserPrincipalEx can not be used in a query against this store

    CODE TO PRODUCE ERROR:

    Dim ctx As New PrincipalContext(ContextType.Domain, DomainController)
    Dim user As UserPrincipalEx = UserPrincipalEx.FindByIdentity(ctx, samAccountName)

    Problem 2: When I attempt to create a new user with my UserPrincipalEx I receive the following error. When I trace the PrincipalContext (ctx) into the class it appears to disconnect from the DomainController.

    Unknown error (0x80005000)

    CODE TO PRODUCE ERROR:

    Dim ctx As New PrincipalContext(ContextType.Domain, DomainController, DirectoryOU)
    Dim NewADUser As New UserPrincipalEx(ctx, newsamAccountName, newPassword, True)

    EXTENDED CLASS:

    Imports System.DirectoryServices.AccountManagement
    Public Class UserPrincipalEx
    Inherits UserPrincipal
    
    Public Sub New(ByVal context As PrincipalContext)
        MyBase.New(context)
    End Sub
    
    Public Sub New(ByVal context As PrincipalContext, ByVal samAccountName As String, ByVal password As String, ByVal enabled As Boolean)
        MyBase.New(context, samAccountName, password, enabled)
    End Sub
    
    <DirectoryProperty("Title")> _
    Public Property Title() As String
        Get
            If ExtensionGet("title").Length <> 1 Then
                Return Nothing
            End If
    
    
            Return DirectCast(ExtensionGet("title")(0), String)
        End Get
        Set(ByVal value As String)
            Me.ExtensionSet("title", value)
        End Set
    End Property
    <DirectoryProperty("physicalDeliveryOfficeName")> _
    Public Property physicalDeliveryOfficeName() As String
        Get
            If ExtensionGet("physicalDeliveryOfficeName").Length <> 1 Then
                Return Nothing
            End If
    
    
            Return DirectCast(ExtensionGet("physicalDeliveryOfficeName")(0), String)
        End Get
        Set(ByVal value As String)
            Me.ExtensionSet("physicalDeliveryOfficeName", value)
        End Set
    End Property
    <DirectoryProperty("Company")> _
    Public Property Company() As String
        Get
            If ExtensionGet("company").Length <> 1 Then
                Return Nothing
            End If
    
    
            Return DirectCast(ExtensionGet("company")(0), String)
        End Get
        Set(ByVal value As String)
            Me.ExtensionSet("company", value)
        End Set
    End Property
    ' Implement the overloaded search method FindByIdentity. 
    Public Shared Shadows Function FindByIdentity(ByVal context As PrincipalContext, ByVal identityValue As String) As UserPrincipalEx
        Return DirectCast(FindByIdentityWithType(context, GetType(UserPrincipalEx), identityValue), UserPrincipalEx)
    End Function
    
    ' Implement the overloaded search method FindByIdentity. 
    Public Shared Shadows Function FindByIdentity(ByVal context As PrincipalContext, ByVal identityType As IdentityType, ByVal identityValue As String) As UserPrincipalEx
        Return DirectCast(FindByIdentityWithType(context, GetType(UserPrincipalEx), identityType, identityValue), UserPrincipalEx)
    End Function
    End Class




    Thursday, May 8, 2014 3:58 PM

Answers

  • PROBLEM 1

    I was able to solve Problem 1 by adding the following to the top of the class after the Imports

    <DirectoryRdnPrefix("CN")> _
    <DirectoryObjectClass("user")> _

    So the full class is now

    Imports System.DirectoryServices.AccountManagement
    <DirectoryRdnPrefix("CN")> _
    <DirectoryObjectClass("user")> _
    Public Class UserPrincipalEx
        Inherits UserPrincipal
    
        Public Sub New(ByVal context As PrincipalContext)
            MyBase.New(context)
        End Sub
    
        Public Sub New(ByVal context As PrincipalContext, ByVal samAccountName As String, ByVal password As String, ByVal enabled As Boolean)
            MyBase.New(context, samAccountName, password, enabled)
        End Sub
    
        <DirectoryProperty("Title")> _
        Public Property Title() As String
            Get
                If ExtensionGet("title").Length <> 1 Then
                    Return Nothing
                End If
    
                Return DirectCast(ExtensionGet("title")(0), String)
            End Get
            Set(ByVal value As String)
                Me.ExtensionSet("title", value)
            End Set
        End Property
        <DirectoryProperty("physicalDeliveryOfficeName")> _
        Public Property physicalDeliveryOfficeName() As String
            Get
                If ExtensionGet("physicalDeliveryOfficeName").Length <> 1 Then
                    Return Nothing
                End If
    
    
                Return DirectCast(ExtensionGet("physicalDeliveryOfficeName")(0), String)
            End Get
            Set(ByVal value As String)
                Me.ExtensionSet("physicalDeliveryOfficeName", value)
            End Set
        End Property
        <DirectoryProperty("Company")> _
        Public Property Company() As String
            Get
                If ExtensionGet("company").Length <> 1 Then
                    Return Nothing
                End If
    
    
                Return DirectCast(ExtensionGet("company")(0), String)
            End Get
            Set(ByVal value As String)
                Me.ExtensionSet("company", value)
            End Set
        End Property
        ' Implement the overloaded search method FindByIdentity. 
        Public Shared Shadows Function FindByIdentity(ByVal context As PrincipalContext, ByVal identityValue As String) As UserPrincipalEx
            Return DirectCast(FindByIdentityWithType(context, GetType(UserPrincipalEx), identityValue), UserPrincipalEx)
        End Function
    
        ' Implement the overloaded search method FindByIdentity. 
        Public Shared Shadows Function FindByIdentity(ByVal context As PrincipalContext, ByVal identityType As IdentityType, ByVal identityValue As String) As UserPrincipalEx
            Return DirectCast(FindByIdentityWithType(context, GetType(UserPrincipalEx), identityType, identityValue), UserPrincipalEx)
        End Function
    End Class

    PROBLEM 2

    I have also been banging my head against this for to long and was finally able to resolve Problem 2.  The DirectoryOU variable did not contain a correct path the intended AD OU.  I was missing a comma and after staring at everything for 30 minutes I finally noticed the issue.


    • Marked as answer by pfitchie Thursday, May 8, 2014 5:07 PM
    • Edited by pfitchie Thursday, May 8, 2014 5:08 PM
    Thursday, May 8, 2014 5:06 PM