<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Programmatically check logical folders groups and permission granted for &amp;amp;sysuserid in New SAS User</title>
    <link>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547810#M8441</link>
    <description>&lt;P&gt;Thanks for sharing code!&lt;/P&gt;</description>
    <pubDate>Tue, 02 Apr 2019 06:20:29 GMT</pubDate>
    <dc:creator>andreas_lds</dc:creator>
    <dc:date>2019-04-02T06:20:29Z</dc:date>
    <item>
      <title>Programmatically check logical folders groups and permission granted for &amp;sysuserid</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547581#M8403</link>
      <description>&lt;P&gt;I have a set of codes that I want to run, only after I have authenticated the user's &amp;amp;sysuserid whether it is granted access in a SAS logical path /Shared Data/yy/&lt;STRONG&gt;zz&lt;/STRONG&gt;. To do this, I have&amp;nbsp;to acquire the user's logical group permission that is tagged to &lt;STRONG&gt;zz&lt;/STRONG&gt; folder whether it is granted Read and ReadMetadata. I have split my task into 2 parts -&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;A : get the users assigned groups, in my case 1 user will only have 1 group assigned&lt;/P&gt;&lt;P&gt;B : get the logical tree's object and find out what groups and permission (read &amp;amp; readmetadata) is assigned to it&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For part A,&amp;nbsp;I done this by acquiring the information from&amp;nbsp; Person, Logins, Domain and IdentityGroups of the user via&amp;nbsp;metadata_getnobj,&amp;nbsp;metadata_getnasn and&amp;nbsp;metadata_getattr.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For part B, I am stuck at Tree &amp;gt; AccessControls&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Attached are the functions I macroed for easy retrieval&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Preparing Macros&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro custom_getnobj(table=, namespace=, outuri=);
data &amp;amp;table;
	length &amp;amp;outuri $ 256;

	n1=1;
	rc1=metadata_getnobj("omsobj:&amp;amp;namespace?@Id contains '.'",n1,&amp;amp;outuri);
	do while (rc1&amp;gt;0);
		output;
		n1+1;
    	rc1=metadata_getnobj("omsobj:&amp;amp;namespace?@Id contains '.'",n1,&amp;amp;outuri);
	end;

	drop n1 rc1;
run;
%mend custom_getnobj;

%macro custom_getnasn(intbl=, outtbl=, namespace=, lkpuri=, outuri=);
data &amp;amp;outtbl;
	set &amp;amp;intbl;

	length &amp;amp;outuri $ 256;

	n1=1;
	rc1=metadata_getnasn(&amp;amp;lkpuri,"&amp;amp;namespace",n1,&amp;amp;outuri);
	do while (rc1&amp;gt;0);
		output;
		n1+1;
		rc1=metadata_getnasn(&amp;amp;lkpuri,"&amp;amp;namespace",n1,&amp;amp;outuri);
	end;

	drop n1 rc1;
run;
%mend custom_getnasn;

%macro custom_getattr(intbl=, outtbl=, lkpuri=, attrmetaname=, attrcolname=, attrcollen=);
data &amp;amp;outtbl;
	set &amp;amp;intbl;

	length &amp;amp;attrcolname &amp;amp;attrcollen;
	rc=metadata_getattr(&amp;amp;lkpuri,"&amp;amp;attrmetaname",&amp;amp;attrcolname);

	drop rc;
run;
%mend custom_getattr;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;Calling Macros Part A&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Get Person Info */
%custom_getnobj(table=metadata_person, namespace=Person, outuri=person_uri);
%custom_getattr(intbl=metadata_person, outtbl=metadata_person, lkpuri=person_uri, attrmetaname=Name, attrcolname=person_name, attrcollen=$60);
%custom_getnasn(intbl=metadata_person, outtbl=metadata_person, namespace=Logins, lkpuri=person_uri, outuri=login_uri);
%custom_getattr(intbl=metadata_person, outtbl=metadata_person, lkpuri=login_uri, attrmetaname=UserId, attrcolname=login_userid, attrcollen=$128);
%custom_getnasn(intbl=metadata_person, outtbl=metadata_person, namespace=Domain, lkpuri=login_uri, outuri=domain_uri);
%custom_getattr(intbl=metadata_person, outtbl=metadata_person, lkpuri=domain_uri, attrmetaname=Name, attrcolname=domain_authname, attrcollen=$60);
%custom_getnasn(intbl=metadata_person, outtbl=metadata_person, namespace=IdentityGroups, lkpuri=person_uri, outuri=idgrp_uri);
%custom_getattr(intbl=metadata_person, outtbl=metadata_person, lkpuri=idgrp_uri, attrmetaname=Name, attrcolname=idgrp_name, attrcollen=$60);

/* Select defaultauth for LAN access and only applicable for group with GRM - */
data metadata_person1;
	set metadata_person;
	if domain_authname = 'DefaultAuth';
	if substr(idgrp_name, 1, length("GRM - ")) = "GRM - ";
run;

&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;Calling Macros Part B&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%custom_getnobj(table=metadata_tree, namespace=Tree, outuri=tree_uri);
%custom_getattr(intbl=metadata_tree, outtbl=metadata_tree, lkpuri=tree_uri, attrmetaname=Name, attrcolname=tree_name, attrcollen=$60);
%custom_getnasn(intbl=metadata_tree, outtbl=metadata_tree, namespace=AccessControls, lkpuri=tree_uri, outuri=ace_uri);
%custom_getnasn(intbl=metadata_tree, outtbl=test, namespace=Permissions, lkpuri=ace_uri, outuri=idgrp_uri);&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2019 02:28:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547581#M8403</guid>
      <dc:creator>cody_s</dc:creator>
      <dc:date>2019-04-02T02:28:27Z</dc:date>
    </item>
    <item>
      <title>Re: Programmatically check logical folders groups and permission granted for &amp;sysuserid</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547793#M8438</link>
      <description>&lt;P&gt;I have figured out the Tree for Part B. It should branch from Tree &amp;gt; AccessControls &amp;gt; Identities &amp;gt; Permissions&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Part B&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Get Tree Info */
%custom_getnobj(table=metadata_tree, namespace=Tree, outuri=tree_uri);
%custom_getattr(intbl=metadata_tree, outtbl=metadata_tree, lkpuri=tree_uri, attrmetaname=Name, attrcolname=tree_name, attrcollen=$60);
%custom_getnasn(intbl=metadata_tree, outtbl=metadata_tree, namespace=AccessControls, lkpuri=tree_uri, outuri=ace_uri);
%custom_getnasn(intbl=metadata_tree, outtbl=metadata_tree, namespace=Identities, lkpuri=ace_uri, outuri=idgrp_uri);
%custom_getattr(intbl=metadata_tree, outtbl=metadata_tree, lkpuri=idgrp_uri, attrmetaname=Name, attrcolname=idgrp_name, attrcollen=$60);
%custom_getnasn(intbl=metadata_tree, outtbl=metadata_tree, namespace=Permissions, lkpuri=ace_uri, outuri=perm_uri);
%custom_getattr(intbl=metadata_tree, outtbl=metadata_tree, lkpuri=perm_uri, attrmetaname=Name, attrcolname=perm_name, attrcollen=$60);
%custom_getattr(intbl=metadata_tree, outtbl=metadata_tree, lkpuri=perm_uri, attrmetaname=Type, attrcolname=perm_type, attrcollen=$100);

%let path = /Shared Data/xx/yy/&lt;STRONG&gt;zz&lt;/STRONG&gt;;
%macro filter_tree;
%let folder_cnt = %sysfunc(countw(&amp;amp;path, /));

proc sql;
	create table metadata_tree_1 as
	select *
	from metadata_tree
	where 1=1
		and perm_name in ( 'Read' 'ReadMetadata' )
		and tree_name in
			(
				/* Only require folders listed in &amp;amp;path */
				%do i = 1 %to &amp;amp;folder_cnt;
					%let cur_folder = %sysfunc(scan(&amp;amp;path, &amp;amp;i, /));
					%put &amp;amp;cur_folder;
					"&amp;amp;cur_folder"
				%end;
			)
	order by
		idgrp_name,
		case
			/* Order by from root to sub folder / by inheritance*/
			%do i = 1 %to &amp;amp;folder_cnt;
				%let cur_folder = %sysfunc(scan(&amp;amp;path, &amp;amp;i, /));
				%put &amp;amp;cur_folder;
				when tree_name = "&amp;amp;cur_folder" then &amp;amp;i
			%end;
			else 999
		end;
quit;

%mend filter_tree;
%filter_tree;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;PART C&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* get the group for this user */
data metadata_person2;
	set metadata_person1 (where=(login_userid = "&amp;amp;sysuserid"));
	call symput("idgrp_name", idgrp_name);
run;

/* get the tree info for this group once identified */
data metadata_tree_2;
	set metadata_tree_1 (where=(idgrp_name = "&amp;amp;idgrp_name"));
run;

/* check the inherited Read and ReadMetadata access */
data metadata_tree_3;
	set metadata_tree_2;

	call symput(perm_name, perm_type);
run;

/* if both &amp;amp;Read and &amp;amp;ReadMetadata are GRANT GRANT then proceed */
%put &amp;amp;Read;
%put &amp;amp;ReadMetadata;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 02 Apr 2019 02:27:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547793#M8438</guid>
      <dc:creator>cody_s</dc:creator>
      <dc:date>2019-04-02T02:27:22Z</dc:date>
    </item>
    <item>
      <title>Re: Programmatically check logical folders groups and permission granted for &amp;sysuserid</title>
      <link>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547810#M8441</link>
      <description>&lt;P&gt;Thanks for sharing code!&lt;/P&gt;</description>
      <pubDate>Tue, 02 Apr 2019 06:20:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/New-SAS-User/Programmatically-check-logical-folders-groups-and-permission/m-p/547810#M8441</guid>
      <dc:creator>andreas_lds</dc:creator>
      <dc:date>2019-04-02T06:20:29Z</dc:date>
    </item>
  </channel>
</rss>

