【问题标题】:SAS script to list all SAS server users from metadata从元数据中列出所有 SAS 服务器用户的 SAS 脚本
【发布时间】:2013-09-23 01:14:01
【问题描述】:

我需要一种将所有 SAS 用户列表从 SAS 元数据导入 Excel 工作表的方法。我正在考虑使用 Microsoft Office 的 SAS 插件来创建一个动态数据源,从 SAS 服务器动态检索用户列表。如果我要这样做,我需要知道如何在 SAS 代码中做到这一点。

有谁知道我将如何编写一个 SAS 脚本来显示 SAS 元数据中所有用户的列表,或者这是否可能?

我一直试图在网上找到一些东西,但没有任何运气。

我有完全的管理员权限,所以没问题。

谢谢!

【问题讨论】:

  • 看起来您可以查看文档以获取此信息 - 例如,support.sas.com/documentation/cdl/en/lrmeta/63180/HTML/default/…
  • 谢谢!页面末尾的示例(“列出用户及其登录名”)是我需要的。你应该把它作为一个答案,这样你才能得到功劳。
  • 我对它的理解还不够,无法将其作为答案 - 如果您充分理解它,请这样做。 (只是一个链接不是一个好的答案 - 答案应该说明如果将来链接断开,如何充分做到这一点)。

标签: excel sas admin administration sas-metadata


【解决方案1】:

感谢 cmets 中的 Joe,我找到了我需要的答案:

http://support.sas.com/documentation/cdl/en/lrmeta/63180/HTML/default/viewer.htm#p1k9zipe59ha2an1pq34gu143lay.htm

我使用了此页面中的最后一个示例,修改为执行 PROC PRINT 而不是导出到 Excel 工作表。在企业指南中,我创建了一个新程序,如下所示:

/*Connect to the metadata server using the metadata system options as 
shown in the first example. */

data work.Identities;

/* The LENGTH statement defines the lengths of variables for function arguments. */
length IdentId IdentName DispName ExtLogin IntLogin DomainName $32 
uri uri2 uri3 uri4 $256;

/* The LABEL statement assigns descriptive labels to variables. */
label
    IdentId    = "Identity Id"
    IdentName  = "Identity Name"
    DispName   = "Display Name"
    ExtLogin   = "External Login"
    IntLogin   = "Is Account Internal?"
    DomainName = "Authentication Domain";

/* The CALL MISSING statement initializes the output variables to missing values. */
call missing(IdentId, IdentName, DispName, ExtLogin, IntLogin, DomainName, 
uri, uri2, uri3, uri4);
n=1;
n2=1;

/* The METADATA_GETNOBJ function specifies to get the Person objects in the repository. 
The n argument specifies to get the first person object that is returned. 
The uri argument will return the actual uri of the Person object. The program prints an 
informational message if no objects are found. */

rc=metadata_getnobj("omsobj:Person?@Id contains '.'",n,uri);
if rc<=0 then put "NOTE: rc=" rc
"There are no identities defined in this repository" 
" or there was an error reading the repository.";

/* The DO statement specifies a group of statements to be executed as a unit. 
The METADATA_GETATTR function gets the values of the Person object's Id, Name, 
and DisplayName attributes. */
do while(rc>0); 
    objrc=metadata_getattr(uri,"Id",IdentId);
    objrc=metadata_getattr(uri,"Name",IdentName); 
    objrc=metadata_getattr(uri,"DisplayName",DispName);

/* The METADATA_GETNASN function gets objects associated via the
InternalLoginInfo association. The InternalLoginInfo association returns
internal logins. The n2 argument specifies to return the first associated object
for that association name. The URI of the associated object is returned in
the uri2 variable. */

objrc=metadata_getnasn(uri,"InternalLoginInfo",n2,uri2);

/* If a Person does not have any internal logins, set their IntLogin
variable to 'No' Otherwise, set to 'Yes'. */
IntLogin="Yes";
DomainName="**None**";
if objrc<=0 then
do;
put "NOTE: There are no internal Logins defined for " IdentName +(-1)".";
IntLogin="No";
end;

/* The METADATA_GETNASN function gets objects associated via the Logins association. 
The Logins association returns external logins. The n2 argument specifies to return 
the first associated object for that association name. The URI of the associated 
object is returned in the uri3 variable. */

objrc=metadata_getnasn(uri,"Logins",n2,uri3);

/* If a Person does not have any logins, set their ExtLogin
variable to '**None**' and output their name. */
if objrc<=0 then
do;
put "NOTE: There are no external Logins defined for " IdentName +(-1)".";
ExtLogin="**None**";
output;
end;

/* If a Person has many logins, loop through the list and retrieve the name of 
each login. */
do while(objrc>0);
objrc=metadata_getattr(uri3,"UserID",ExtLogin);

/* If a Login is associated to an authentication domain, get the domain name. */
DomainName="**None**";
objrc2=metadata_getnasn(uri3,"Domain",1,uri4);
if objrc2 >0 then
do;
 objrc2=metadata_getattr(uri4,"Name",DomainName);
end;

/*Output the record. */
output;

n2+1;

/* Retrieve the next Login's information */
objrc=metadata_getnasn(uri,"Logins",n2,uri3);
end; /*do while objrc*/

/* Retrieve the next Person's information */
n+1;
n2=1;

rc=metadata_getnobj("omsobj:Person?@Id contains '.'",n,uri);
end; /*do while rc*/

/* The KEEP statement specifies the variables to include in the output data set. */
keep IdentId IdentName DispName ExtLogin IntLogin DomainName; 
run;

/* The PROC PRINT statement writes a basic listing of the data. */
proc print data=work.Identities label;
run;

/* The PROC EXPORT statement can be used to write the data to an Excel spreadsheet. */
/* Change DATA= to the data set name you specified above. */
/* Change OUTFILE= to an appropriate path for your system. */
/*
proc export data=work.Identities 
    dbms=EXCE 
    outfile="C:\temp\Identities.xls"
    replace;
run;
*/

PROC PRINT DATA=work.Identities;

执行此操作时,它会创建一个 SAS 报告。我将该报告导出为 .srx 文件,然后使用 SAS Plugin for Microsoft Office 将报告添加到 Excel 工作表中(“报告”按钮)。

然后我右键单击添加报告的单元格并单击属性,然后将其设置为在打开文档时自动更新。

这是以管理员身份审核用户的好方法。不必单独检查每个系统以查看用户是否存在(例如,当他们离开公司时)我为我们的每个 SAS 系统提供了一张表,为我们的每个 Teradata 系统提供了一张表(使用查询运行自动更新)通过 ODBC),以及从包含我们的 MicroStrategy 用户列表的单独电子表格自动更新的另一个工作表。它使检查所有系统变得像单个 Ctrl + F 一样简单。

【讨论】:

  • 仅供参考 - 我已经意识到报告不会自动更新。我认为这在 SAS 9.4 之前是不可能的,那时您可以将代码嵌入到 Office 文档中。
【解决方案2】:

如果您只想提取 SAS 中的用户列表,您可以编译此 macro 并运行:

%mm_getusers(outds=myusers)

免责声明 - 我写了它,我们在我们的商业产品 (https://datacontroller.io) 中使用它,因此用户可以在工具内应用权限时看到组成员身份。

【讨论】:

  • 该 proc 没有直接创建数据集的 OUT= 选项是否有充分的理由?除了新的 SAS 开发人员不了解 SAS 的工作原理吗?
  • @Tom - 我想知道您的评论是否与现在已删除的评论有关?还是您的意思是 proc 元数据(其中 out 选项与 fileref 相关,而不是数据集)?
  • 目前不确定。大概。我怀疑 PROC METADATA 查询的来源是将数据保存在 XML 中而不是可用的结构中,因此他们只是将转换推给用户。
  • 实际上我认为最终的来源是系统(数据集)库,但是在所有情况下(除了特定的数据步骤函数)与元数据的交互都是基于 XML 的。该模型不能很好地适应传统的表结构,至少在没有大量键的情况下不能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多