Хм, добро пожаловать в путаницу, которую вызывает 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(" - Task: " + currentTask.Name + "<br />");
Array taskOperations = (Array)currentTask.Operations;
foreach (string operationId in taskOperations)
{
IAzOperation currentOperation = azApp.OpenOperation(operationId, null);
output.Append(" - Operation: " + currentOperation.Name + "<br />");
}
}
}
return output.ToString();
}
В задачах или операциях нет перечислителей, только массив имен, поэтому, если вам нужно что-то другое, кроме имени, вам нужно вызвать App.OpenXXX() для получения дополнительной информации.
Надеюсь это поможет ...
person
Logic Labs
schedule
12.11.2009