我正在使用来自COM参考"azroles 1.0 Type Library"的AZROLESLib,我正在尝试为我当前在授权管理器中设置的每个角色创建一个指定任务的列表,但是当我循环执行任务时角色,我得到角色名称.
我环顾四周但找不到任何有用的东西.
这是我目前得到的(它不是超级漂亮,但我只是想让它在此刻工作).
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(" -" + ob.ToString() + "<br />");
}
}
return output.ToString();
Run Code Online (Sandbox Code Playgroud)
出来的是:
管理员 - 管理员
客户经理 - 账户经理
企业营销专家 - 企业营销专员
一般员工 - 一般员工
营销经理 - 营销经理
区域营销专家 - 区域营销专员
销售经理 - 销售经理
网站管理员 - 网站管理员
但应该出现的是:
提前致谢.
嗯,欢迎来到AzMan的混乱:-)目前有3种不同的版本/接口,有两种不同的方法可以满足您的要求.
从标准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 |
Run Code Online (Sandbox Code Playgroud)
注意:您还应该记住,您在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();
}
Run Code Online (Sandbox Code Playgroud)
如果您知道您的目标平台将是Windows 7,Vista或Windows Server 2008,那么您应该使用IAzManApplication3接口,这是更好的定义(RoleDefinition有它自己的集合/类型).如果您在Windows XP上进行开发,则需要安装Windows Server 2008 Administration Pack,这将随更新的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();
}
Run Code Online (Sandbox Code Playgroud)
任务或操作上没有枚举器,只有一个名称数组,因此如果您需要除名称之外的任何内容,则需要调用App.OpenXXX()以获取更多信息.
希望这可以帮助 ...