通过 SAS Base 上的程序在 SAS 元数据服务器中创建内部帐户

2024-06-20

我正在尝试通过使用以编程方式创建内部帐户proc metadata。 下面的代码部分创建具有外部登录的人员。

put"<Person Name=%str(%')&&PersonName&i.%str(%')>";
   put"<Logins>";
      put"<Login Name=%str(%')Login.&&PersonName&i.%str(%')  Password=%str(%')&&word&i.%str(%')/>";
   put"</Logins>";
put"</Person>";

要创建外部登录,我们无法设置属性Password,并且在 SAS 元数据中它将自动加密。 但是要创建InternalLogin类型的对象,必须使hash密码的值和salt。我知道标准sas002加密方法,但在使用的情况下proc pwencode如何获取盐的值?

是否可以使用 SAS Base 创建InternalLogin?

Thanx.


很快。我找到了一个article https://communities.sas.com/t5/tkb/articleprintpage/tkb-id/library/article-id/1667?attachment-id=9295这可以告诉我们如何为这个问题创建存储过程。我的回答是对文章的补充。
该方法基于从 sas 程序执行 java 方法。

1. 前置setPasswd.java类

我已经修改了文章中的类。连接到元数据服务器并创建的单独代码InternalLogin

import java.rmi.RemoteException;
import com.sas.metadata.remote.AssociationList;
import com.sas.metadata.remote.CMetadata;
import com.sas.metadata.remote.Person;
import com.sas.metadata.remote.MdException;
import com.sas.metadata.remote.MdFactory;
import com.sas.metadata.remote.MdFactoryImpl;
import com.sas.metadata.remote.MdOMIUtil;
import com.sas.metadata.remote.MdOMRConnection;
import com.sas.metadata.remote.MdObjectStore;
import com.sas.metadata.remote.MetadataObjects;
import com.sas.metadata.remote.PrimaryType;
import com.sas.metadata.remote.Tree;
import com.sas.meta.SASOMI.ISecurity_1_1;
import com.sas.iom.SASIOMDefs.VariableArray2dOfStringHolder;

public class setPasswd {
  String serverName = null;
  String serverPort = null;
  String serverUser = null;
  String serverPass = null;
  MdOMRConnection connection = null;
  MdFactoryImpl _factory = null;
  ISecurity_1_1 iSecurity = null;
  MdObjectStore objectStore = null;
  Person person = null;

    public int connectToMetadata(String name, String port, String user, String pass){
    try {
            serverName = name;
          serverPort = port;
          serverUser = user;
          serverPass = pass;
      _factory = new MdFactoryImpl(false);
      connection = _factory.getConnection();
      connection.makeOMRConnection(serverName, serverPort, serverUser, serverPass);
      iSecurity = connection.MakeISecurityConnection();
      return 0;

    }catch(Exception e){
      return 1;
    }
    }

    public setPasswd(){};

    public int changePasswd(String IdentityName, String IdentityPassword) {
        try
        {
            //
            // This block obtains the person metadata ID that is needed to change the password
            //
            // Defines the GetIdentityInfo 'ReturnUnrestrictedSource' option.
            final String[][] options ={{"ReturnUnrestrictedSource",""}};
            // Defines a stringholder for the info output parameter.
            VariableArray2dOfStringHolder info = new VariableArray2dOfStringHolder();
            // Issues the GetInfo method for the provided iSecurity connection user.
            iSecurity.GetInfo("GetIdentityInfo","Person:"+IdentityName, options, info);
            String[][] returnArray = info.value;
            String personMetaID = new String();
            for (int i=0; i< returnArray.length; i++ )
            {
                System.out.println(returnArray[i][0] + "=" + returnArray[i][1]);
                if (returnArray[i][0].compareTo("IdentityObjectID") == 0) {
                    personMetaID = returnArray[i][1];
                }
            }
            objectStore = _factory.createObjectStore();
            person = (Person) _factory.createComplexMetadataObject(objectStore, IdentityName, MetadataObjects.PERSON, personMetaID);
            iSecurity.SetInternalPassword(IdentityName, IdentityPassword);
            person.updateMetadataAll();
            System.out.println("Password has been changed.");
            return 0; // success
        }
        catch (MdException e)
        {
            Throwable t = e.getCause();
            if (t != null)
            {
                String ErrorType = e.getSASMessageSeverity();
                String ErrorMsg = e.getSASMessage();
                if (ErrorType == null)
                {
                    // If there is no SAS server message, write a Java/CORBA message.
                }
                else
                {
                    // If there is a message from the server:
                    System.out.println(ErrorType + ": " + ErrorMsg);
                }
                if (t instanceof org.omg.CORBA.COMM_FAILURE)
                {
                    // If there is an invalid port number or host name:
                    System.out.println(e.getLocalizedMessage());
                }
                else if (t instanceof org.omg.CORBA.NO_PERMISSION)
                {
                    // If there is an invalid user ID or password:
                    System.out.println(e.getLocalizedMessage());
                }
            }
            else
            {
                // If we cannot find a nested exception, get message and print.
                System.out.println(e.getLocalizedMessage());
            }
            // If there is an error, print the entire stack trace.
            e.printStackTrace();
        }
        catch (RemoteException e)
        {
            // Unknown exception.
            e.printStackTrace();
        }
        catch (Exception e)
        {
            // Unknown exception.
            e.printStackTrace();
        }
        System.out.println("Failure: Password has NOT been changed.");
        return 1; // failure
    }
}

2. 解决方案取决于

课堂上注意进口。要启用执行以下必要设置的代码CLASSPATH环境变量。

在 Linux 上,您可以添加下一个命令%SASConfig%/Lev1/level_env_usermods.sh:

export CLASSPATH=$CLASSPATH:%pathToJar%

在 Windows 上,您可以通过以下方式添加/更改环境变量Advanced system settings


那么应该在哪里搜索 jar 文件呢?它们位于文件夹中:

%SASHome%/SASVersionedJarRepository/eclipse/plugins/

我应该在路径中包含哪些文件?

我已经包含了 OMI 中使用的所有内容(开放元数据接口 https://support.sas.com/documentation/cdl/en/omaref/68021/HTML/default/viewer.htm#p0522mtdjome30n1j0t0ku3ziwoy.htm)。我还添加了log4j.jar(没有这个罐子就无法工作。你的提示会很有帮助):

  • sas.oma.joma.jar
  • sas.oma.joma.rmt.jar
  • sas.oma.omi.jar
  • sas.svc.connection.jar
  • sas.core.jar
  • sas.entities.jar
  • sas.security.sspi.jar
  • log4j.jar
  • setPasswd.jar (下一步就是你的罐子!)

从最近的版本中选择文件。例子:

我在这里设置文件v940m3f(修复版本)。
其他方式是here https://support.sas.com/documentation/cdl/en/lrcon/69852/HTML/default/viewer.htm#n0swy2q7eouj2fn11g1o28q57v4u.htm.

3.编译setPasswd.jar

我尝试使用内部javac.exe进入SAS,但它不能正常工作。所以你需要下载JDK来编译jar。我已经创建了 Bat 文件:

"C:\Program Files\Java\jdk1.8.0_121\bin\javac.exe" -source 1.7  -target 1.7 setPasswd.java
"C:\Program Files\Java\jdk1.8.0_121\bin\jar" -cf setPasswd.jar setPasswd.class

参数-source and -target如果您的 JDK 版本较高(在 SAS 中使用),将会很有帮助。您可以通过以下方式查看“sas”-java 的版本:

PROC javainfo all;
run; 

在日志中搜索下一个字符串:

java.vm.规格.版本 = 1.7

4.最后。 SAS 基本调用

现在我们可以通过这个方法调用Java代码(所有方法都可用here https://support.sas.com/documentation/cdl/en/lrcon/69852/HTML/default/viewer.htm#n0swy2q7eouj2fn11g1o28q57v4u.htm):

data test;
      dcl javaobj j ("setPasswd");
      j.callIntMethod("connectToMetadata", "%SERVER%", "%PORT%", "%ADMIN%", "%{SAS002}HASHPASSORPASS%", rc1);
      j.callIntMethod("changePasswd", "testPassLogin", "pass1", rc2);
      j.delete();
run;

In log:

UserClass=Normal  
AuthenticatedUserid=Unknown  
IdentityName=testPass  
IdentityType=Person  
IdentityObjectID=A56RQPC2.AP00000I  
Password has been changed.  

现在是时候进行测试了。创建没有密码的新用户。

执行代码:

data test;
      dcl javaobj j ("setPasswd");
      j.callIntMethod("connectToMetadata", "&server.", "&port.", "&adm", "&pass", rc1);
      j.callIntMethod("changePasswd", "TestUserForStack", "Overflow", rc2);
      j.delete();
run;

现在我们的用户有了InternalLogin 对象。

Thanx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 SAS Base 上的程序在 SAS 元数据服务器中创建内部帐户 的相关文章

  • sas7bdat 变量名称中带有空格

    我收到了几个扩展名为 sas7bdat 的 SAS 数据集文件 我在 Windows 上使用 SAS 9 3 这些文件的创建者显然使用了不同的环境和 或软件 许多文件的 var 名称包含空格和其他无效字符 甚至运行一个proc conten
  • 使用条件随机字段进行命名实体识别

    What is 条件随机场 具体如何条件随机场识别结构化或非结构化文本中的人 组织或地点等专有名称 例如 该产品由 StackOverFlow Inc 订购 条件随机场如何将 StackOverFlow Inc 识别为一个组织 CRF 是一
  • 如何在更新宏变量的数据步骤中调用宏并立即使用该值?

    下面的例子非常简单 可能可以用更简单的方式解决 不过 我有兴趣让它发挥作用 以下示例基于 sashelp library 的 cars dataset 首先 我有一个名为 fun 的宏 proc contents data sashelp
  • 设置非 Office 文件的 Windows 文件属性

    我想在 NET 代码中设置文件的属性 我尝试过使用 DSOFile v2 1 如下所示 var properties new OleDocumentProperties try properties Open filePath proper
  • java 注释:用 xml 文件覆盖注释的库

    Java 有注释 这很好 然而 一些开发人员认为最好使用 xml 文件用元数据注释代码 其他开发人员更喜欢注释 但会使用元数据覆盖源代码中的注释 我正在编写一个使用注释的 Java 框架 问题是 是否有一种标准方法来定义和解析 xml 文件
  • 如何获取 Angular 2 中当前模块的元数据?

    我想获取当前的元数据NgModule为了得到列表declarations and providers为了填充动态模块 我创建了一个在模态中显示组件的模块 那怎么办呢 您可以使用以下方式访问声明reflect metadata https g
  • 转置逗号分隔字段

    我有一个如下所示的数据集 并且正在使用 SAS Enterprise Guide 6 3 data have input id state cards 134 NC NY SC 145 AL NC NY SC run 我有另一个数据集 其中
  • 在 SAS 中生成数组的所有唯一排列

    在 SAS 中 如果我有一个如下所示的字符串或数组 array x 4 1 A B C D 我需要生成元素的所有 独特 排列 如下所示 ABCD ABC BCD ACD ABD AB AC AD BC BD CD A B C D SAS中有
  • 当我只想更改一个列属性时,是否必须在 SQL 语句中包含所有列属性?

    我有一个 MySQL 数据库 我想通过向所有列添加注释来进行注释 从我读到的MySQL 文档 http dev mysql com doc refman 5 5 en alter table html 在更改其中任何一个时 必须包括数据类型
  • 使用 Ffmpeg 编辑视频元数据

    我想更改视频元数据 原始视频信息 ffmpeg i video mp4 Metadata major brand mp42 minor version 0 compatible brands isomavc1mp42 creation ti
  • 如果出现错误,SAS 会发送电子邮件

    是否有任何代码 宏可以合并到我的 SAS 程序中 一旦我的 SAS 代码在运行时发生错误 它就会向我发送电子邮件 另外 这封电子邮件是否可能包含所发生的错误 是的 又不是 这是可能的 但没有好的方法来做到这一点 您必须在每个过程之后检查是否
  • 尽管设置了元数据,Reflect.getMetadata() 返回未定义

    我正在尝试在我的 TypeScript 应用程序中使用注释 但是我一定做错了什么 因为Reflect getMetadata 总是返回undefined 尽管我可以在调试器中看到元数据似乎设置正确 my class ts 带有带注释的属性
  • SAS 日期格式与 SQL Server 日期不兼容

    我对 SAS 相当陌生 最近我们将一些 SAS 数据集迁移到 SQL Server 表 但我们仍在使用 SAS 进行分析 当 SAS 尝试从 SQL Server 表中引入数据并让 SAS 检查 srv edt 日期是否在 dos beg
  • SAS Proc SQL 中的列表聚合和组串联

    我有一个数据集 必须根据粒度 FIELD1 和 FIELD2 进行汇总 必须对两个指标字段 METRIC1 和 METRIC2 求和 到目前为止 这似乎是一个简单的 GROUP BY 任务 但我有一个字符串字段 FLAG 也必须通过连接不同
  • 从音频流获取元数据

    我想从我正在使用 AVQueuePlayer 播放的 AVPlayerItem 中的流 URL 获取文件名和专辑图像 如果可能 但我不知道如何执行此操作 另外 如果我的流媒体 URL 没有任何元数据 我可以将元数据放入我的流媒体 URL 中
  • 在新窗口中打开 SAS 程序

    目前 当您在 Windows 中双击 SAS 文件时 它将在您已打开的现有 SAS 会话中打开它 有没有办法让它在窗口中单击时会启动一个新的 SAS 窗口 据我所知 SAS 是一个所谓的 单实例 应用程序 因此它的默认行为是在现有会话中打开
  • TIFF 元数据的最大大小是多少?

    TIFF 文件元数据的单个字段中可以合并的元数据数量是否有最大限制 我想在 ImageDescription 字段中存储大文本 最多几 MB 没有具体的最大限制ImageDescription但是 整个 TIFF 文件存在最大文件大小 该最
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • SAS中MISSING和NULL的区别

    在 SAS 中 在 WHERE 子句中使用时 两者之间有什么区别 WHERE col1 is MISSING vs WHERE col1 is NULL 你能解释一下 col1 是 char 时和 col1 是 numeric 时的情况吗
  • 查找表或视图的依赖对象

    背景 在 PostgreSQL 中删除 或替换 对象时 如果存在依赖关系 则删除将失败 不指定CASCADE Problem 数据库返回的错误信息没有列出依赖对象 示例解决方案 该查询可能类似于 SELECT FROM informatio

随机推荐