EDIT4:让我的应用程序将用户写入活动目录,但当我尝试启用用户时,活动目录会抱怨
以前的消息
我正在尝试使用Java(1.4)和LDAP将用户添加到我的本地Active Directory(使用AD LDS)。 但是,我一直收到以下错误:
javax.naming.directory.SchemaViolationException:[LDAP:错误代码65 - 0000207B:UpdErr:DSID-030511CF,问题6002(OBJ_CLASS_VIOLATION),数据0];剩下的> name'CN = Test user,OU = Accounts,DC = PORTAL,DC = COMPANY,DC = BE'
我的代码:
public static void main(String[] args) {
try {
DirContext ctx = new InitialDirContext(X_Ldap.getEnvironment());
user usr = new user("Test user", "FALSE");
ctx.bind(
"CN=Test user,OU=Accounts,DC=PORTAL,DC=COMPANY,DC=BE", usr);
// X_Ldap.checkIfUserExists("Test User");
ctx.close();
} catch (NamingException e) {
e.printStackTrace();
}
}
public class user implements DirContext {
String type;
/**
*
* @param isDisabled
* TRUE or FALSE (literally)
*/
public user(String username, String isDisabled) {
String type = username;
Attributes attr = new BasicAttributes(true);
Attribute oc = new BasicAttribute("objectclass");
oc.add("top");
oc.add("person");
oc.add("organizationalPerson");
oc.add("user");
Attribute memberOf = new BasicAttribute("memberOf");
memberOf.add("CN=Users,CN=Roles,DC=PORTAL,DC=COMPANY,DC=BE");
attr.put(oc);
attr.put("msDS-UserAccountDisabled", isDisabled);
attr.put(memberOf);
attr.put("comment", username);
}
public String toString() {
return type;
}
}
修改 我检查了一个用户对象的强制属性,但我不确定我应该填写所有这些属性:
cn:Jane Doe - Unicode字符串
instanceType:0x4 =(WRITE) - 整数
objectCategory:CN = Person,CN = Schema,CN = Configuration,CN = {EDBEACA1-6F60-413C-80F2-6C5CE265F22F} - 可分辨名称
objectClass:top;人; organizationalPerson; user - 对象标识符
objectSid:S-1-372665300-2234744891-519896106-1336725265-1748609191-3385095770 - SID
EDIT2:我目前的代码:
public class newuser {
public static void main(String[] args) {
String userName = "cn=Albert Einstein,ou=Accounts,DC=PORTAL,DC=COMPANY,DC=BE";
// String groupName =
// "cn=Users,cn=Roles,DC=PORTAL,DC=COMPANY,DC=BE";
try {
// Create the initial directory context
System.out.println("Creating initial directory context...");
LdapContext ctx = new InitialLdapContext(X_Ldap.getEnvironment(),
null);
// Create attributes to be associated with the new user
Attributes attrs = new BasicAttributes(true);
// some useful constants from lmaccess.h
int UF_ACCOUNTDISABLE = 0x0002;
int UF_PASSWD_NOTREQD = 0x0020;
int UF_PASSWD_CANT_CHANGE = 0x0040;
int UF_NORMAL_ACCOUNT = 0x0200;
int UF_DONT_EXPIRE_PASSWD = 0x10000;
int UF_PASSWORD_EXPIRED = 0x800000;
attrs.put("objectClass", "user");
attrs.put("cn", "Albert Einstein");
// These are some optional (but useful) attributes
attrs.put("givenName", "Albert");
attrs.put("sn", "Einstein");
attrs.put("displayName", "Albert Einstein");
attrs.put("description", "Research Scientist");
attrs.put("userPrincipalName", "AlbertE@antipodes.com");
attrs.put("mail", "relativity@antipodes.com");
attrs.put("telephoneNumber", "999 123 4567");
String newQuotedPassword = "\"Pass123\"";
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
attrs.put("unicodePwd", newUnicodePassword);
attrs.put("msDS-User-Account-Control-Computed",
Integer.toString(UF_NORMAL_ACCOUNT + UF_DONT_EXPIRE_PASSWD));
// Create the context
System.out.println("Creating context...");
Context result = ctx.createSubcontext(userName, attrs);
System.out.println("Created disabled account for: " + userName);
ctx.close();
System.out.println("Successfully created User: " + userName);
} catch (NamingException e) {
System.err.println("Problem creating object: " + e);
}
catch (IOException e) {
System.err.println("Problem creating object: " + e);
}
}
}
仍有以下问题:
String newQuotedPassword = "\"Pass123\"";
byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16");
attrs.put("unicodePwd", newUnicodePassword);
给了我以下例外:
创建初始目录上下文...问题创建对象: java.io.UnsupportedEncodingException:UTF16LE
注意:我已禁用SSL更改密码的要求
编辑3:显然AD LDS不支持“用户帐户控制”,并且分为许多不同的属性。
答案 0 :(得分:2)
您或许可以查看Using JAVA code with Active Directory,特别是Creating new users & demystifying userAccountControl
对我来说,你忘记了“CN
”属性。
答案 1 :(得分:1)
检查您的架构文档,person
,user
和organizationalPerson
对象类允许和需要哪些属性。确保代码尝试添加的条目具有所需的所有属性,并且只包含允许或必需的属性。
答案 2 :(得分:1)
以下是我在为Active Directory 2008开发用户帐户管理应用程序(ASP .NET)时学到的知识:
您应该填写sAMAccountName或userPrincipalName
在根据域密码策略为其设置密码
任何与密码相关的操作都需要使用安全连接
创建帐户时,如果要创建用户对象,请打开OU的上下文。然后调用添加方法
阅读本文档:http://msdn.microsoft.com/en-us/magazine/cc135979.aspx
(我知道,适用于.NET,但它与Java LDAP api非常相似)
希望这有助于你
答案 3 :(得分:0)
对象类架构违规意味着您尝试创建的对象中缺少一个或多个必需属性。因此,您需要查看top,person,organizationalPerson和user的模式,并确保设置所需的所有属性。