I managed to come up with procedures which can get Azman role members belong to a certain role drilling into all Active Directory groups too. The second procedure is for the other way around. It gets all roles in an application defines the user in Azman.
----------------------------------------------------------------------------
ALTER PROCEDURE [dbo].[SelectAzmanRoles] (@ApplicationName varchar(50), @UserID varchar(50), @bRecursive bit=0)
--returns all roles for @UserID. when @bRecursive=1, it drills into groups recursively.
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Roles TABLE (cn varchar(1024));
DECLARE @tmpTable TABLE (cn varchar(1024));
DECLARE @tmpTable2 TABLE (distinguishedName varchar(1024));
DECLARE @ApplicationCN varchar(1024);
DECLARE @RoleObjectContainrCN varchar(1024);
DECLARE @UserDN varchar(MAX);
DECLARE @SQLString nvarchar(MAX);
SET @SQLString='SELECT cn FROM OPENQUERY(ADSI,''SELECT cn FROM ''''LDAP://cn=myCompany Apps,cn=Program Data,dc=corp,dc=myCompany,dc=com''''
WHERE objectClass=''''msDS-AzApplication'''' AND
msDS-AzApplicationName='''''+@ApplicationName+''''''')';
INSERT @tmpTable EXEC(@SQLString);
SET @ApplicationCN=(SELECT TOP 1 cn FROM @tmpTable);
SET @RoleObjectContainrCN='AzRoleObjectContainer-'+@ApplicationCN;
SET @SQLString='SELECT distinguishedName FROM OPENQUERY(ADSI,''SELECT distinguishedName FROM ''''LDAP://dc=corp,dc=myCompany,dc=com''''
WHERE sAMAccountName='''''+@UserID+''''''')';
INSERT @tmpTable2 EXEC(@SQLString);
SET @UserDN=(SELECT TOP 1 distinguishedName FROM @tmpTable2);
SET @SQLString='SELECT cn FROM OPENQUERY(ADSI,''SELECT cn FROM ''''LDAP://cn='+@RoleObjectContainrCN+',cn='
+@ApplicationCN+',cn=myCompany Apps,cn=Program Data,dc=corp,dc=myCompany,dc=com''''
WHERE msDS-MembersForAzRole='''''+@UserDN+''''''')'
IF @bRecursive=0
BEGIN
EXEC(@SQLString);
RETURN;
END;
ELSE
BEGIN
INSERT @Roles EXEC(@SQLString);
DECLARE @Groups TABLE(cn varchar(1024),dn varchar(1024));
--Get all groups to which this user belongs
SET @SQLString='SELECT cn,distinguishedName FROM OPENQUERY (ADSI, ''<LDAP://dc=corp,dc=myCompany,dc=com>;
(&(objectCategory=group)(member:1.2.840.113556.1.4.1941:=' +@UserDN +'));cn,distinguishedName;subtree'' )' ;
PRINT @SQLstring;
INSERT @Groups EXEC(@SQLString);
--Get all person members who belong to those groups using a cursor
DECLARE @cn varchar(1024);
DECLARE @dn varchar(1024);
DECLARE cGroups CURSOR
FOR SELECT cn,dn FROM @Groups;
OPEN cGroups;
FETCH NEXT FROM cGroups INTO @cn, @dn
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString='SELECT cn FROM OPENQUERY (ADSI, ''<LDAP://cn='+@RoleObjectContainrCN+',cn='
+@ApplicationCN+',cn=myCompany Apps,cn=Program Data,dc=corp,dc=myCompany,dc=com>;
(&(objectCategory=CN=ms-DS-Az-Role,CN=Schema,CN=Configuration,DC=corp,DC=myCompany,DC=com)(msDS-MembersForAzRole=' +@dn +'));cn;subtree'' )' ;
PRINT @SQLstring;
INSERT @Roles EXEC(@SQLString);
FETCH NEXT FROM cGroups INTO @cn, @dn;
END;
CLOSE cGroups;
DEALLOCATE cGroups;
END;
SELECT DISTINCT cn FROM @Roles;
RETURN
END
/*
--Get all members of a group
select cn,AdsPath
from openquery (
ADSI,
'<;(&(objectCategory=person)(memberOf:1.2.840.113556.1.4.1941:=CN=Administrators,CN=Builtin,DC=corp,DC=myCompany">LDAP://dc=corp,dc=myCompany,dc=com>;(&(objectCategory=person)(memberOf:1.2.840.113556.1.4.1941:=CN=Administrators,CN=Builtin,DC=corp,DC=myCompany,
DC=com));cn, adspath;subtree'
)
order BY cn;
--get all groups a user is a member of
select cn,AdsPath
from openquery (
ADSI, '<;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=Nam">LDAP://dc=corp,dc=myCompany,dc=com>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=CN=Nam
Park,OU=Developers,OU=Staff,DC=corp,DC=myCompany,DC=com));cn, adspath;subtree'
)
order BY cn;
*/
-----------------------------------------------------------------------
ALTER PROCEDURE [dbo].[SelectAzmanRoleMembers] (@ApplicationName varchar(50), @Role varchar(50), @bRecursive bit=0)
--returns all members in the @Role. When @brecursive=1, it drills into groups recursively.
AS
BEGIN
DECLARE @PersonMembers TABLE(cn varchar(1024),distinguishedName varchar(1024));
DECLARE @Application TABLE (cn varchar(1024));
DECLARE @ApplicationCN varchar(1024);
DECLARE @SQLString nvarchar(MAX);
SET @SQLString='SELECT cn FROM OPENQUERY(ADSI,''SELECT cn FROM ''''LDAP://cn=myCompany Apps,cn=Program Data,dc=corp,dc=myCompany,dc=com''''
WHERE msDS-AzApplicationName='''''+@ApplicationName+''''''')';
INSERT @Application EXEC(@SQLString);
SET @ApplicationCN=(SELECT TOP 1 cn FROM @Application);
IF @bRecursive=0
BEGIN
SET @SQLString='SELECT cn,distinguishedName FROM OPENQUERY(ADSI,''SELECT cn,distinguishedName FROM
''''LDAP://dc=corp,dc=myCompany,dc=com''''
WHERE objectCategory=''''person'''' AND
msDS-MembersForAzRoleBL=''''CN='+@Role+',CN=AzRoleObjectContainer-'+@ApplicationCN+',CN='+@ApplicationCN+
',CN=myCompany Apps,CN=Program Data,DC=corp,DC=myCompany,DC=com'''''')'
EXEC(@SQLString);
RETURN;
END;
ELSE --Drill into groups recursively
BEGIN
DECLARE @Groups TABLE(cn varchar(1024),distinguishedName varchar(1024));
--Get direct level persons memebers
SET @SQLString='SELECT cn,distinguishedName FROM OPENQUERY(ADSI,''SELECT cn,distinguishedName FROM
''''LDAP://dc=corp,dc=myCompany,dc=com''''
WHERE objectCategory=''''person'''' AND
msDS-MembersForAzRoleBL=''''CN='+@Role+',CN=AzRoleObjectContainer-'+@ApplicationCN+',CN='+@ApplicationCN+
',CN=myCompany Apps,CN=Program Data,DC=corp,DC=myCompany,DC=com'''''')'
INSERT @PersonMembers EXEC(@SQLString);
--Get all group members
SET @SQLString='SELECT cn,distinguishedName FROM OPENQUERY(ADSI,''SELECT cn,distinguishedName FROM
''''LDAP://dc=corp,dc=myCompany,dc=com''''
WHERE objectCategory=''''group'''' AND
msDS-MembersForAzRoleBL=''''CN='+@Role+',CN=AzRoleObjectContainer-'+@ApplicationCN+',CN='+@ApplicationCN+
',CN=myCompany Apps,CN=Program Data,DC=corp,DC=myCompany,DC=com'''''')';
INSERT @Groups EXEC(@SQLString);
--Get all person members who belong to those groups using a cursor
DECLARE @cn varchar(1024);
DECLARE @dn varchar(1024);
DECLARE cGroups CURSOR
FOR SELECT cn,distinguishedName FROM @Groups;
OPEN cGroups;
FETCH NEXT FROM cGroups INTO @cn, @dn
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString='SELECT cn,distinguishedName FROM OPENQUERY (ADSI, ''<LDAP://dc=corp,dc=myCompany,dc=com>;
(&(objectCategory=person)(memberOf:1.2.840.113556.1.4.1941:=' +@dn +'));cn,distinguishedName;subtree'' )' ;
--See http://msdn.microsoft.com/en-us/library/aa746475(VS.85).aspx for recursive matching rule
INSERT @PersonMembers EXEC(@SQLString);
FETCH NEXT FROM cGroups INTO @cn, @dn;
END;
CLOSE cGroups;
DEALLOCATE cGroups;
END;
SELECT DISTINCT cn,distinguishedName FROM @PersonMembers;
RETURN
END