ActiveDirectory登録用スクリプト
先ほどのメイン処理にひき続いて、ActiveDirectory登録用のスクリプト
ホントは所属するグループもデータベースから引っこ抜いてきて処理させたかったんやけど
グループツリーが複雑すぎるんでユーザ追加のみ実装、相変わらずぶさいくなコードです。
メールサーバ登録部分は公開なし。ブラウザ立ち上げて某社さんのツールで登録するという
ブラウザ制御のやつなんで、ここでは載せられない・・・。
そういえば、Samba4.0出てきてActiveDirectory使えるようになってるらしい。
実用レベルだとするとActiveDirectoryとファイルサーバをLinuxで構築して
CALを削減するということもできそうと感じたりした。
ちょろっと修正したソース。汚いのには代わりはないが・・・
ホントは所属するグループもデータベースから引っこ抜いてきて処理させたかったんやけど
グループツリーが複雑すぎるんでユーザ追加のみ実装、相変わらずぶさいくなコードです。
メールサーバ登録部分は公開なし。ブラウザ立ち上げて某社さんのツールで登録するという
ブラウザ制御のやつなんで、ここでは載せられない・・・。
そういえば、Samba4.0出てきてActiveDirectory使えるようになってるらしい。
実用レベルだとするとActiveDirectoryとファイルサーバをLinuxで構築して
CALを削減するということもできそうと感じたりした。
ちょろっと修正したソース。汚いのには代わりはないが・・・
Function ActiveDirectoryAdd(val_Uname,val_UloginID,val_Upassword,val_Email,val_Place) Dim argRtn(5) '引数チェック用 Dim strUserName 'ユーザ名 Dim strLoginID 'WindowsログインID Dim strPassword 'Windowsパスワード Dim strEmailAdd 'Emailアドレス Dim strPlace '事業所 Dim dtStart Dim objConnection Dim objCommand Dim objRecordSet Dim objOU Dim objUser Dim nwErrChk Dim adServName Dim adDc Dim adDomain Dim userFrags adServName = "XXXX" adDc = "CN=users,dc=XXXX,dc=local" adDomain = "XXXX.local" Const UF_DONT_EXPIRE_PASSWORD = &H10000 'パスワード無期限 '/* 引数エラーチェック argRtn(0)= argumentChecker(val_Uname) argRtn(1)= argumentChecker(val_UloginID) argRtn(2)= argumentChecker(val_Upassword) argRtn(3)= argumentChecker(val_Email) argRtn(4)= argumentChecker(val_Place) If argRtn(0) ="False" Or argRtn(1) ="False" Or argRtn(2)="False" Or argRtn(3) ="False" Or argRtn(4) ="False" Then ActiveDirectoryAdd = "False" Logrtn = OutLogger("[Err],ユーザ名等が入力されていません。") If Logrtn = "False" Then WScript.Echo LErrMsg End If Exit Function Else strUserName = val_Uname strLoginID = val_UloginID strPassword = val_Upassword strEmailAdd = val_Email strPlace = val_Place nwErrChk = ServerConnectChk(adServName) If nwErrChk = "False" Then Set objConnection = Nothing ActiveDirectoryAdd = "False" Logrtn = OutLogger("[Err],ActiveDirectory接続に失敗しました。") If Logrtn = "False" Then WScript.Echo LErrMsg End If Exit Function Else '********* ①ActiveDirectoryユーザ検索 dtStart = TimeValue(Now()) Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" Set objCommand = CreateObject("ADODB.Command") objCommand.ActiveConnection = objConnection objCommand.CommandText = _ ";(&(objectCategory=User)" & _ "(samAccountName=" & strLoginID & "));samAccountName;subtree" 'ActiveDirectory接続不可チェック '** AD接続しユーザ追加を行う(ユーザが未登録時のみ) Set objRecordSet = objCommand.Execute If objRecordset.RecordCount = 0 Then 'オブジェクト追加 Set objOU = GetObject("LDAP://" & adDc ) 'OU登録 Set objUser = objOU.Create("User", "cn=" & strUserName ) objUser.Put "sAMAccountName", strLoginID 'ログインアカウント名 objUser.Put "userPrincipalName", strLoginID &"@" & adDomain 'ユーザログイン名 objUser.Put "sn", strUserName '姓 objUser.Put "displayName", strUserName '表示名 objUser.Put "mail", strEmailAdd 'メールアドレス objUser.Put "physicalDeliveryOfficeName", strPlace '事業所 objUser.SetInfo objUser.GetInfo objUser.SetPassword strPassword 'ドメインパスワード objUser.IsAccountLocked = False 'アカウントロックしない objUser.AccountDisabled = False 'アカウント無効にしない objUser.SetInfo ' パスワードを無期限、パスワード変更不可 objUser.GetInfo userFrags = objUser.Get("userAccountControl") userFrags = userFrags Or UF_DONT_EXPIRE_PASSWORD 'パスワードを無期限にする objUser.Put "userAccountControl", userFrags objUser.SetInfo ActiveDirectoryAdd = "True" objConnection.Close Exit Function Else ActiveDirectoryAdd = "False" Logrtn = OutLogger("[Err]," & "ユーザ:" & strLoginID & " は既に存在しています。ActiveDirectoryとACCESSデータベースの内容を再確認してください。") If Logrtn = "False" Then WScript.Echo LErrMsg End If Exit Function objConnection.Close End If End If End If End Function '-------------------------------------------------------------------------------------------------- Function ADGroupAdd(val_UloginID,val_Group) Dim argRtn(2) '引数チェック用 Dim strLoginID 'WindowsログインID Dim strGroup '所属グループ Dim dtStart Dim objConnection Dim objOU Dim objUser 'ユーザ用 Dim objGroup 'グループ用 Dim nwErrChk Dim adServName Dim adDc Dim adDomain Dim userFrags Dim adGroup Dim adUseradd adServName = "XXXX" adDc = "CN=users,dc=XXXX,dc=local" adDomain = "XXXX.local" '/* 引数エラーチェック argRtn(0)= argumentChecker(val_UloginID) argRtn(1)= argumentChecker(val_Group) If argRtn(0) ="False" Or argRtn(1) ="False" Then ADGroupAdd = "False" Logrtn = OutLogger("[Err],ユーザ名等が入力されていません。") If Logrtn = "False" Then WScript.Echo LErrMsg End If Exit Function Else strLoginID = val_UloginID strGroup = val_Group nwErrChk = ServerConnectChk(adServName) If nwErrChk = "False" Then Set objConnection = Nothing ADGroupAdd = "False" Logrtn = OutLogger("[Err],ActiveDirectory接続に失敗しました。") If Logrtn = "False" Then WScript.Echo LErrMsg End If Exit Function Else '** AD登録済みユーザに所属部署を設定する。 Set objConnection = CreateObject("ADODB.Connection") objConnection.Open "Provider=ADsDSOObject;" adGroup = "CN=" & strGroup & "," & adDc '追加対象グループ adUseradd ="CN=" & strLoginID & "," & adDc '追加対象ユーザ Set objGroup = GetObject("LDAP://" & adGroup ) Set objUser = GetObject("LDAP://" & adUseradd ) If Not objGroup.IsMember(objUser.ADsPath) Then objGroup.Add(objUser.ADsPath) Else ADGroupAdd = "False" Logrtn = OutLogger("[Err],このグループには既に登録済です。") If Logrtn = "False" Then WScript.Echo LErrMsg End If objConnection.Close Exit Function End If ADGroupAdd = "True" objConnection.Close Exit Function End If End If End Function '-------------------------------------------------------------------------------------------------- Function argumentChecker(val_strTarget) Dim strTarget strTarget = val_strTarget argumentChecker = "True" '""をチェック If strTarget = "" Then argumentChecker="False" End If 'Nullチェック If IsNull(strTarget) = True Then argumentChecker="False" End If '空白チェック If IsEmpty(strTarget) = True Then argumentChecker="False" End If End Function '-------------------------------------------------------------------------------------------------- Function ServerConnectChk(val_ServName) Dim objWMIService Dim colItems Dim objItem Dim strComputer strComputer = val_ServName Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set colItems = objWMIService.ExecQuery _ ("Select * from Win32_PingStatus " & _ "Where Address = '" & strComputer & "'") For Each objItem In colItems If objItem.StatusCode = 0 Then ServerConnectChk="True" Else ServerConnectChk="False" Logrtn = OutLogger("[Err],サーバへのネットワーク接続ができていない可能性があります。") If Logrtn = "False" Then WScript.Echo LErrMsg End If End If Next Set objWMIService = Nothing Set colItems = Nothing Exit Function End Function '-------------------------------------------------------------------------------------------------- Function OutLogger(val_ErrMsg) Dim LogMsg Dim objFso ' FileSystemObject Dim objText ' テキストファイルオブジェクト Const LOG_FILE_NAME = "PGNAME" If val_ErrMsg ="" Then OutLogger = "False" LogMsg = "処理内容:," & CStr(Now()) & ", [Err],エラーメッセージ空白" Else OutLogger = "True" LogMsg = "処理内容:," & CStr(Now()) & ", " & val_ErrMsg End If Set objFso = WScript.CreateObject("Scripting.FileSystemObject") ' 追記モードで開く(存在しない場合は新規作成) Set objText = objFso.OpenTextFile(LOG_FILE_NAME & ".log", 8, True) objText.Write LogMsg & vbCrLf objText.Close Set objText = Nothing Set objFso = Nothing Exit Function End Function '--------------------------------------------------------------------------------------------------
コメント