在SAS基础上通过编程在SAS元数据服务器中创建内部帐户

在SAS基础上通过编程在SAS元数据服务器中创建内部帐户,sas,metadata,sas-metadata,Sas,Metadata,Sas Metadata,我正在尝试使用proc metadata创建内部帐户programmaticaly。 下面的代码部分创建具有外部登录名的人员 put"<Person Name=%str(%')&&PersonName&i.%str(%')>"; put"<Logins>"; put"<Login Name=%str(%')Login.&&PersonName&i.%str(%') Password=%str(%')

我正在尝试使用
proc metadata
创建内部帐户programmaticaly。 下面的代码部分创建具有外部登录名的人员

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>";
put”“;
将“”改为“;
将“”改为“;
将“”改为“;
将“”改为“;
要创建外部登录,我们可以设置属性
密码
,在SAS元数据中,它将自动加密。 但要创建对象的内部登录类型,必须设置密码的哈希值和salt。我知道标准的
sas002
加密方法,但是在使用
proc pwcode
的情况下如何获取salt的值

是否可以使用SAS Base创建内部登录

Thanx.

等等。我发现了一个可以告诉我们如何为这个问题创建存储进程的方法。我的答案是对文章的补充。
该方法基于sas程序中的executejava方法

1.preravel 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
    }
}
在Windows上,您可以通过
高级系统设置添加/更改环境变量


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

%SASHome%/sasversionedjarepository/eclipse/plugins/

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

我已经包括了OMI()中使用的所有内容。此外,我还添加了
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将从下一步开始!)
从最近的版本中选择文件。例如:

这里我是从
v940m3f
(修复版本)设置的文件。
其他方式是

3.编译setPasswd.jar 我尝试过在SAS中使用internal
javac.exe
,但它没有正常工作。所以你需要下载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
如果您的JDK版本高于SAS中使用的版本,那么参数
-source
-target
将非常有用。“sas”-java的版本,您可以通过以下方式查看:

PROC javainfo all;
run; 
在日志中搜索下一个字符串:

java.vm.specification.version=1.7

4.最后SAS基本呼叫 现在我们可以通过这个方法调用Java代码(所有方法都可用):

在日志中:

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对象


塔克斯

您说过:“要创建对象的InternalLogin类型,必须设置密码和salt的哈希值”。你怎么知道的?SAS002不使用Salt,仅使用SAS/SECURE@VasilijNevlev hello Vasilij中的SAS003和SAS004。SAS002不使用salt,但内部登录的密码基于密码+salt,然后由SAS002编码。我已经解决了这个问题,稍后将回答这个问题。谢谢你的通讯网,我为我的英语感到抱歉。Уббббббббббббббббб!“SanekZhitnik-请发布您的答案!”!这类信息对于我们这些对自动化SAS部署感兴趣的人来说非常有用。@AllanBowe soon。但我使用sas+Java解决了这个问题。
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;