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

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

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

我一直在试图find网上的东西,但没有任何运气。

我有完整的pipe理员权限,所以没有问题。

谢谢!

感谢乔在评论中find了我需要的答案:

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

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

/*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; 

当它被执行时,它创build了一个SAS报告。 我将该报表导出为.srx文件,然后使用Microsoft Office的SAS插件将报表添加到Excel工作表(“报表”button)中。

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

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