近期由于工作需要整理一下自動化的東西,因為公司去年上線了OA,所以公司的入職系統會提交用戶的信息到IT部門,最早的做法是入職到了,IT部門收集用戶信息在AD中創建對應的用戶信息,所以為了提高管理員的工作效率,所以準備實施自動創建AD賬戶,當OA流程到IT人員審批節點后,IT人員審批后根據人員信息自動創建AD賬戶,所以整理了一些JAVA創建AD人員信息的信息,但是我們需要注意點的是,對于JAVA語言操作MS AD的一些普通操作是不需要SSL的,但是對于用戶密碼的重置操作必須使用SSL,當然之前看網上有說可以跳過的,但是沒有試驗成功,所以還是按照標準的配置來通過SSL對用戶的AD密碼進行操作,廢話不多說了,今天我們主要介紹使用JAVA通過SSL方式創建MS AD賬戶,因為要對創建的用戶設置密碼,所以需要使用SSL證書,既然需要SSL證書,目的就是為了讓JAVA信任LDAP,所以我們需要從AD中導出受信任的證書,然后導入到JAVA運行環境中的JRE下的cacert證書文件中。我們既然說到了OA,其實OA中就可以通過系統自帶的功能進行證書申請及證書導入,這樣比較簡單;當然如果沒有OA環境的,我們可以通過JAVA運行環境中的JDK中的keytool進行證書導入工作,我們下面都會介紹到;
我們首先使用OA中的功能進行證書導入;我們OA中的證書路勁在/OAFS/WEAVER/jdk1.8.0_101/jre/lib/security/cacerts
確認OA環境中的JDK路勁后,我們接下來就是證書申請及導入了;
我們訪問OA的地址,然后路勁增加/integration/ldapcert.jsp路勁訪問即可;如果沒有后面的JAVA文件可以找OA供應商要;或者在附件下載;
我們首先下載附件中的文件,下載后,附件中有三個文件;classbean、
我們首先進入classbean文件夾內的內容拷貝到對應的OA服務器的對應目錄;
ecology\classbean\weaver\ldap
2.然后將解壓文件中的文件夾integration文件中的以下文件拷貝到OA的對應的服務器目錄下:
ecology\integration
3.因為解壓后有三個文件夾,第三個文件夾src為源碼,我們就不用管了
按照以上方法走完后,我們就可以通過以下鏈接來配置了
http://192.168.6.101/integration/ldapcert.jsp
訪問后,我們再LDAP IP輸入環境的AD DC服務器地址,系統會默認填寫LDAP端口636,及證書路勁,這些信息系統會自動補全;我們需要手動設置證書密碼,一般我們都會設置成changeit,設置好這些信息后,我們導入證書,會提示下面的導入信息;
導入完成
然后我們需要在證書路勁下載證書到本地的JRE環境進行測試了
接著我們看看第二種方式的證書申請;
我們需要從DC上導入域的根證書
mmc---增加---證書---計算機---個人---選擇根證書----導出
不需要導出私鑰
使用默認的DRE編碼
保存
我們按照同樣的方式,將另外一張也導出來
然后我們需要在本地的JDK環境中導入該根證書到JDK環境中的證書中;
我本地的JDK環境路勁D:\Development_Environment\java\jdk\jre\lib\security
然后運行命令將剛才導出的根證書導入到該路勁的cacert證書文件中;
我們首先要cd到jdk路勁
1 | cd ?D:\Development_Environment\java\jdk\jre\bin |
然后將剛才導出的根證書保存到D盤下,通過以下命令導入
1 | keytool?keytool?- import ?-keystore????D:\Development_Environment\java\jdk\jre\lib\security\cacerts?-storepass?changeit?-keypass?changeit?- alias ?CA?- file ?d:\ADroot.cer |
輸入Y受信任
然后我們就可以通過
接著就是看看ADDS環境了
換進準備好,我們就可以上代碼了;
我們設置好證書路勁,及LDAP驗證信息,及需要注冊的用戶名
賬戶注冊成功
上代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | package ?com.ixmsoft.oa.util;??? ?? ?import ?java.util.Properties;??? ?? ?import ?javax.naming.*;??? import ?javax.naming.ldap.*;??? import ?javax.naming.directory.*;??? ?? ?/**?? ? *?@author?Keven?Chen?? ? *?@version?$Revision?1.0?$?? ? *??? ? */ ??public ?class ?AddAdUser?{??? ???? private ?static ?final ?String?SUN_JNDI_PROVIDER?=? "com.sun.jndi.ldap.LdapCtxFactory" ;??? ?? ????? public ?static ?void ?main(String[]?args)? throws ?Exception?{??? ???????? String?keystore?=? "D:\\Development_Environment\\java\\jdk\\jre\\lib\\security\\cacerts" ;??? ???????? System.setProperty( "javax.net.ssl.trustStore" ,?keystore);??? ?? ????????? Properties?env?=? new ?Properties();??? ?? ????????? env.put(Context.INITIAL_CONTEXT_FACTORY,?SUN_JNDI_PROVIDER); //?java.naming.factory.initial??? ???????? env.put(Context.PROVIDER_URL,? "ldap://192.168.5.20:636" );//?java.naming.provider.url??? ???????? env.put(Context.SECURITY_AUTHENTICATION,? "simple" ); //?java.naming.security.authentication??? ???????? env.put(Context.SECURITY_PRINCIPAL,??? ???????????????? "cn=Administrator,cn=Users,dc=ixmsoft,dc=com" ); //?java.naming.security.principal??? ???????? env.put(Context.SECURITY_CREDENTIALS,? "123" ); //?java.naming.security.credentials??? ???????? env.put(Context.SECURITY_PROTOCOL,? "ssl" );??? ?? ????????? String?userName?=? "CN=gaowenlong,OU=IXM?Adm,OU=IMXSOFT?Users,DC=ixmsoft,DC=com" ;??? ???????? String?groupName?=? "CN=Domain?Admins,CN=Users,DC=ixmsoft,DC=com" ;??? ?? ????????? LdapContext?ctx?=? new ?InitialLdapContext(env,? null );??? ?? ????????? //?Create?attributes?to?be?associated?with?the?new?user??? ???????? Attributes?attrs?=? new ?BasicAttributes( true );??? ?? ????????? //?These?are?the?mandatory?attributes?for?a?user?object??? ???????? //?Note?that?Win2K3?will?automagically?create?a?random??? ???????? //?samAccountName?if?it?is?not?present.?(Win2K?does?not)??? ???????? attrs.put( "objectClass" ,? "user" );??? ???????? attrs.put( "sAMAccountName" ,? "gaowenlong" );??? ???????? attrs.put( "cn" ,? "gaowenlong" );??? ?? ????????? //?These?are?some?optional?(but?useful)?attributes??? ???????? attrs.put( "sn" ,? "gaowenlong" );??? ???????? attrs.put( "displayName" ,? "gaowenlong" );??? ???????? attrs.put( "description" ,? "gaowenlong" );??? ???????? attrs.put( "userPrincipalName" ,? "gaowenlong@ixmsoft.com" );??? ???????? attrs.put( "mail" ,? "gaowenlong@ixmsoft.com" );??? ???????? attrs.put( "telephoneNumber" ,? "1234568999" );??? ?? ????????? //?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 ;??? //密碼已經過期 ?? ????????? //?Note?that?you?need?to?create?the?user?object?before?you?can??? ???????? //?set?the?password.?Therefore?as?the?user?is?created?with?no??? ???????? //?password,?user?AccountControl?must?be?set?to?the?following??? ???????? //?otherwise?the?Win2K3?password?filter?will?return?error?53??? ???????? //?unwilling?to?perform.??? ?? ????????? attrs.put( "userAccountControl" ,?Integer.toString(UF_NORMAL_ACCOUNT??? ???????????????? +?UF_PASSWD_NOTREQD?+?UF_PASSWORD_EXPIRED?+?UF_ACCOUNTDISABLE));??? ?? ????????? //?Create?the?context??? ???????? Context?result?=?ctx.createSubcontext(userName,?attrs);??? ???????? System.out.println( "Created?disabled?account?for:?" ?+?userName);??? ?? ????????? ModificationItem[]?mods?=? new ?ModificationItem[ 2 ];??? ?? ????????? //?Replace?the?"unicdodePwd"?attribute?with?a?new?value??? ???????? //?Password?must?be?both?Unicode?and?a?quoted?string??? ???????? String?newQuotedPassword?=? "\"Password2000\"" ;??? ???????? byte []?newUnicodePassword?=?newQuotedPassword.getBytes( "UTF-16LE" );??? ?? ????????? mods[ 0 ]?=? new ?ModificationItem(DirContext.REPLACE_ATTRIBUTE,??? ???????????????? new ?BasicAttribute( "unicodePwd" ,?newUnicodePassword));??? ???????? mods[ 1 ]?=? new ?ModificationItem(DirContext.REPLACE_ATTRIBUTE,??? ???????????????? new ?BasicAttribute( "userAccountControl" ,?Integer??? ???????????????????????? .toString(UF_NORMAL_ACCOUNT?+?UF_PASSWORD_EXPIRED)));??? ?? ????????? //?Perform?the?update??? ???????? ctx.modifyAttributes(userName,?mods);??? ???????? System.out.println( "Set?password?&?updated?userccountControl" );??? ???????? //?now?add?the?user?to?a?group.??? ?? ????????? try ?{??? ???????????? ModificationItem?member[]?=? new ?ModificationItem[ 1 ];??? ???????????? member[ 0 ]?=? new ?ModificationItem(DirContext.ADD_ATTRIBUTE,??? ???????????????????? new ?BasicAttribute( "member" ,?userName));??? ?? ????????????? ctx.modifyAttributes(groupName,?member);??? ???????????? System.out.println( "Added?user?to?group:?" ?+?groupName);??? ?? ????????? }? catch ?(NamingException?e)?{??? ???????????? System.err.println( "Problem?adding?user?to?group:?" ?+?e);??? ???????? }??? ???????? //?Could?have?put?tls.close()?prior?to?the?group?modification??? ???????? //?but?it?seems?to?screw?up?the?connection?or?context????? ?? ????????? ctx.close();??? ?? ????????? System.out.println( "Successfully?created?User:?" ?+?userName);??? ?? ????? }??? ?? ?} |
我們查看
查看賬戶屬性
然后查看屬性
我們將java文件上傳到附件中,如果加在eclipse中有報錯,請根據錯誤提示,右擊導入ldap相關的包即可,
本文轉自 高文龍 51CTO博客,原文鏈接:http://blog.51cto.com/gaowenlong/1969585,如需轉載請自行聯系原作者