gpt4 book ai didi

sas - 在 SAS Base 上通过程序在 SAS Metadata Server 中创建内部帐户

转载 作者:行者123 更新时间:2023-12-03 17:40:02 25 4
gpt4 key购买 nike

我正在尝试使用 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>";

要创建 ExternalLogin,我们可以设置属性 Password , 而在 SAS 元数据中,它将被自动加密。
但是要创建 InternalLogin 类型的对象,必须使 哈希密码的值和 .我知道标准 sas002加密方法,但在使用 proc pwencode 的情况下如何获得盐的值(value)?

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

谢谢。

最佳答案

很快。我找到了一个 article可以告诉我们如何为这个问题创建存储过程。我的回答是对文章的补充。
该方法基于从 sas 程序执行 java 方法。

1. 自带 setPasswd.java 类

我已经修改了文章中的类(class)。连接元数据服务器并创建的单独代码 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( Open Metadata Interface ) 中使用的所有内容。此外,我还添加了 log4j.jar (没有这个 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 (您下一步的 jar !)

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

    enter image description here

    这里我设置了来自 v940m3f 的文件(修复发布)。
    其他方式是 here .

    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-target如果您的 JDK 版本高于 SAS 中使用的版本,则会有所帮助。您可以通过以下方式看到“sas”-java的版本:
    PROC javainfo all;
    run;

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

    java.vm.specification.version = 1.7



    4. 最后。 SAS 基本调用

    现在我们可以通过这个方法调用Java代码(所有方法可用 here):
    data test;
    dcl javaobj j ("setPasswd");
    j.callIntMethod("connectToMetadata", "%SERVER%", "%PORT%", "%ADMIN%", "%{SAS002}HASHPASSORPASS%", rc1);
    j.callIntMethod("changePasswd", "testPassLogin", "pass1", rc2);
    j.delete();
    run;

    在日志中:
    UserClass=Normal  
    AuthenticatedUserid=Unknown
    IdentityName=testPass
    IdentityType=Person
    IdentityObjectID=A56RQPC2.AP00000I
    Password has been changed.

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

    enter image description here

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

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

    enter image description here

    谢谢。

    关于sas - 在 SAS Base 上通过程序在 SAS Metadata Server 中创建内部帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41953244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com