Получение списка Задач, принадлежащих Роли от Азмана

Я использую AZROLESLib, который находится в ссылках COM "Библиотека типов azroles 1.0", и я пытаюсь создать список назначенных задач для каждой роли, которую я в настоящее время установил в своем диспетчере авторизации, но когда я перебираю задачи для роль, я получаю имя роли.

Я все облазил, но не нашел ничего, что могло бы помочь.

Вот что у меня есть на данный момент (это не очень красиво, но я просто пытаюсь заставить его работать на данный момент).

AzAuthorizationStoreClass AzManStore = new AzAuthorizationStoreClass();
AzManStore.Initialize(0, ConfigurationManager.ConnectionStrings["AzManStore"].ConnectionString, null);
IAzApplication azApp = AzManStore.OpenApplication("StoreName", null);
StringBuilder output = new StringBuilder();
Array tasks = null;
foreach (IAzRole currentRole in azApp.Roles)
{
    output.Append(currentRole.Name + "<br />");

    tasks = (Array)currentRole.Tasks;
    foreach (object ob in tasks)
    {
        output.Append("&nbsp;&nbsp; -" + ob.ToString() + "<br />");
    }
}             
return output.ToString();

Выходит:

  • Администратор -Администратор

  • Менеджер по работе с клиентами - Менеджер по работе с клиентами

  • Специалист по корпоративному маркетингу - Специалист по корпоративному маркетингу

  • Генеральный служащий - Генеральный служащий

  • Менеджер по маркетингу - Менеджер по маркетингу

  • Региональный специалист по маркетингу - Региональный специалист по маркетингу

  • Менеджер по продажам - Менеджер по продажам

  • Вебмастер -Вебмастер

но должно получиться что-то вроде:

  • Webmaster
    • Websites Maintain
    • Обсуждение новостей
    • События
    • Отчеты прочитаны

Заранее спасибо.


person Community    schedule 26.10.2009    source источник


Ответы (1)


Хм, добро пожаловать в путаницу, которую вызывает AzMan :-) В настоящее время существует 3 разных версии/интерфейса с 2 разными способами выполнения того, что вы просите.

В стандартном COM-интерфейсе (IAzApplication) app.Roles относится к роли Назначения (участник, назначенный ролям), тогда как я думаю, что вам нужны определения ролей, которые не были t представлен как отдельный тип до более поздней версии 3.

Для IAzApplication: чтобы получить доступ к определениям ролей, вам необходимо выполнить итерацию по всем app.Tasks и проверить флаг task.IsRoleDefinition, чтобы получить определения ролей.

| IAzApplication3     | IAzApplication            |
|---------------------|---------------------------|
| app.RoleAssignments | app.Roles                 |

| app.RoleDefinitions | app.Tasks                 |
|                     | and only consider tasks:  |
|                     | task.IsRoleDefinition = 1 |

Примечание. Вы также должны иметь в виду, что то, что вы пытаетесь сделать, не так просто в AzMan, как исходное кодовое решение. Роли могут состоять из вложенных ролей, задач и операций, задачи могут состоять из вложенных задач и операций.. поэтому вам действительно нужно повторно пройтись по ролям, чтобы создать полный список операций, задач и ролей в каждой заданной роли.

Следующий код выведет полную иерархию определений ролей приложений для всех версий AzMan (просто для фантазии, в нем есть лямбда обратного вызова .NET 3.5 и универсальный код, но это можно было бы достаточно легко переписать для .NET 1.0). ). Обратный вызов возвращает тип (Роль, Задача, Операция), имя и глубину иерархии (для отступа):

    private static void ProcessAzManRoleDefinitions(IAzApplication app, IAzTask task, int level, Action<string, string, int> callbackAction)
    {
        bool isRole = (task.IsRoleDefinition == 1);

        callbackAction((isRole ? "Role" : "Task"), task.Name, level);
        level++;

        // Iterate over any subtasks defined for this task (or role)
        Array tasks = (Array)task.Tasks;
        foreach (string taskName in tasks)
        {
            IAzTask currentTask = app.OpenTask(taskName, null);

            // Need to recursively process child roles and tasks
            ProcessAzManRoleDefinitions(app, currentTask, level, callbackAction);
        }

        // Iterate over any opeations defined for this task (or role)
        Array taskOperations = (Array)task.Operations;
        foreach (string operationName in taskOperations)
            callbackAction("Operation", operationName, level);
    }

    private static string GetRoleDefinitionHierarchy()
    {
        AzAuthorizationStore azManStore = new AzAuthorizationStoreClass();
        azManStore.Initialize(0, "connectionstring", null);
        IAzApplication azApp = azManStore.OpenApplication("TestApp", null);

        StringBuilder output = new StringBuilder();

        foreach (IAzTask task in azApp.Tasks)
        {
            if (task.IsRoleDefinition == 1)
                ProcessAzManRoleDefinitions(azApp, task, 0, (type, name, level) => output.Append("".PadLeft(level * 2) + type + ": " + name + "\n"));
        }

        return output.ToString();
    }

Если вы знаете, что вашей целевой платформой будет Windows 7, Vista или Windows Server 2008, вам следует использовать интерфейс IAzManApplication3, и он гораздо лучше определен (у RoleDefinition есть собственная коллекция/тип). Если вы разрабатываете для Windows XP, вам потребуется установить пакет администрирования Windows Server 2008, который будет поставляться с обновленной DLL AzMan.

Для AzMan v3 следующий код будет перебирать иерархию определений ролей, задач и операций (это эквивалент v3 того, что вы просили изначально):

private string GetAllRoleDefinitionHierarchies()
{
    AzAuthorizationStore azManStore = new AzAuthorizationStoreClass();
    azManStore.Initialize(0, "connectionstring", null);
    IAzApplication3 azApp = azManStore.OpenApplication("TestApp", null) as IAzApplication3;

    if (azApp == null)
        throw new NotSupportedException("Getting Role Definitions is not supported by older versions of AzMan COM interface");

    StringBuilder output = new StringBuilder();
    foreach (IAzRoleDefinition currentRoleDefinition in azApp.RoleDefinitions)
    {
        output.Append(currentRoleDefinition.Name + "<br />");
        Array roleTasks = (Array) currentRoleDefinition.Tasks;
        foreach (string taskId in roleTasks)
        {
            IAzTask currentTask = azApp.OpenTask(taskId, null);
            output.Append("&nbsp;&nbsp; - Task: " + currentTask.Name + "<br />");

            Array taskOperations = (Array)currentTask.Operations;
            foreach (string operationId in taskOperations)
            {
                IAzOperation currentOperation = azApp.OpenOperation(operationId, null);
                output.Append("&nbsp;&nbsp;&nbsp;&nbsp; - Operation: " + currentOperation.Name + "<br />");
            }
        }
    }

    return output.ToString();
}

В задачах или операциях нет перечислителей, только массив имен, поэтому, если вам нужно что-то другое, кроме имени, вам нужно вызвать App.OpenXXX() для получения дополнительной информации.

Надеюсь это поможет ...

person Logic Labs    schedule 12.11.2009
comment
Я ВЕРЮ, что установил правильный SDK для Windows 8.1, но не могу найти ссылку на IAzApplication3. Подскажите, пожалуйста, как добавить его в мой проект? Спасибо! - person Mike Murphy; 22.10.2015
comment
В Visual Studio вы можете либо использовать COM-ссылку на AzRolesLib (я проверил в Windows 10, и она все еще доступна), либо добавить ссылку на библиотеки Interop в GAC, добавив ссылку, нажав «Обзор» и выбрав C:\Windows. \assembly\GAC_64\Microsoft.Interop.Security.AzRoles\2.0.0.0__31bf3856ad364e35\Microsoft.Interop.Security.AzRoles.dll ИЛИ эквивалент GAC_32. - person Logic Labs; 25.10.2015