嗯,欢迎对 AzMan 的困惑 :-) 目前有 3 种不同的版本/界面,有 2 种不同的方法来做你所要求的。
在标准 COM 接口(IAzApplication)中,app.Roles 指的是角色分配(分配给角色的成员),而我认为您想要的是角色定义,直到版本 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 回调 lambda 和一个泛型,但这可以很容易地为 .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 管理包,它会随更新的 AzMan DLL 一起提供。
对于 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() 以获取更多信息。
希望这可以帮助 ...