I'm trying to create users in WebLogic (10.3.4) programmatically from a simple standalone Java client (one class --> two methods: createWeblogicUser() & main()).
public void createWeblogicUser() { try { Hashtable<String, String> env = new Hashtable<String, String>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.SECURITY_PRINCIPAL, "weblogic"); env.put(Context.SECURITY_CREDENTIALS, "weblogic"); env.put(Context.PROVIDER_URL, "t3://myserver:7001"); InitialContext ctx = new InitialContext(env); MBeanServer wls = (MBeanServer) ctx.lookup("java:comp/env/jmx/runtime"); ObjectName userEditor = null; ObjectName mBeanTypeService = new ObjectName( "com.bea:Name=MBeanTypeService, Type=weblogic.management.mbeanservers.MBeanTypeService"); ObjectName rs = new ObjectName("com.bea:Name=RuntimeService, Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean"); ObjectName domainMBean = (ObjectName) wls.getAttribute(rs, "DomainConfiguration"); ObjectName securityConfig = (ObjectName) wls.getAttribute(domainMBean, "SecurityConfiguration"); ObjectName defaultRealm = (ObjectName) wls.getAttribute(securityConfig, "DefaultRealm"); ObjectName[] authProviders = (ObjectName[]) wls.getAttribute(defaultRealm, "AuthenticationProviders"); for(ObjectName providerName : authProviders) { if(userEditor == null) { ModelMBeanInfo info = (ModelMBeanInfo) wls.getMBeanInfo(providerName); String className = (String) info.getMBeanDescriptor().getFieldValue("interfaceClassName"); if(className != null) { String[] mba = (String[]) wls.invoke(mBeanTypeService , "getSubtypes" , new Object[] {"weblogic.management.security.authentication.UserEditorMBean"} , new String[] {"java.lang.String"} ); for(String mb : mba) { if(className.equals(mb)) userEditor = providerName; } } } if(userEditor == null) throw new RuntimeException("Could not retrieve user editor"); try { wls.invoke(userEditor , "createUser" , new Object[] {"wls_user", "password123","User created programmatically."} , new String[] {"java.lang.String", "java.lang.String","java.lang.String"} ); } catch(Exception e){ e.printStackTrace(); } ctx.close(); } } catch(Exception ex) { ex.printStackTrace(); }
}
Any ideas on what the context lookup I should be making? "java:comp" throws a javax.naming.NameNotFoundException; looks like I can use that only from w/in a container.