用于从元数据中列出所有SAS服务器用户的SAS脚本

问题描述 投票:3回答:2

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

有人知道我将如何编写SAS脚本以显示SAS元数据中所有用户的列表,或者甚至有可能吗?

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

我具有完整的管理员特权,所以那里没有问题。

谢谢!

excel sas admin administration sas-metadata
2个回答
2
投票

感谢乔在评论中我找到了所需的答案:

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一样简单。


0
投票

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

%mm_getusers()

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

© www.soinside.com 2019 - 2024. All rights reserved.