首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Azman获得属于角色的任务列表

从Azman获得属于角色的任务列表
EN

Stack Overflow用户
提问于 2009-10-26 22:38:42
回答 1查看 2.7K关注 0票数 5

我使用的是来自COM引用“azros1.0TypeLibrary”的AZROLESLib,我试图为我目前在授权管理器中设置的每个角色创建一个指定任务的列表,但是当我循环该角色的任务时,我得到了角色名称。

我到处找遍了,但找不到任何有帮助的东西。

这是我目前得到的(它不是超级漂亮,但我只是尝试使它在目前)。

代码语言:javascript
复制
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();

出来的是

行政长官、-Administrator

  • Account经理、Manager

  • Corporate营销专家、-Corporate市场营销专家、Specialist

  • General雇员-General Employee

  • Marketing经理-Marketing Manager

  • Regional营销专家-Regional营销经理-Sales Manager

  • Webmaster -Webmaster

,但应该发布的是类似于:

Maintain

  • News Maintain

  • Events Maintain

  • Reports Read

  • 网站管理员
    • 网站

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2009-11-12 17:45:04

AzMan :-)目前有3种不同的版本/接口,有2种不同的方法来执行您的要求。

在标准COM接口(IAzApplication)中,app.Roles引用角色赋值(分配给角色的成员),而我认为您想要的是角色定义,直到第3版的后面才引入角色定义。

对于IAzApplication:要访问角色定义,您需要遍历所有的app.Tasks并检查task.IsRoleDefinition标志以获得角色定义。

代码语言:javascript
复制
| 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轻松地重新编写)。回调返回类型(角色、任务、操作)、名称和层次结构深度(用于缩进):

代码语言:javascript
复制
    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();
    }

如果您知道您的目标平台将是Windows7、Vista或Windows 2008,那么您应该使用IAzManApplication3接口,这是一个更好的定义(RoleDefinition有自己的集合/类型)。如果您正在Windows上开发,您将需要安装WindowsServer2008AdministrationPack,这将与更新的AzMan DLL一起提供。

对于AzMan v3,以下代码将迭代角色定义、任务和操作的层次结构(这是您最初要求的v3等效的内容):

代码语言:javascript
复制
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()。

希望这能帮上忙。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1627744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档