つぶねこ
@もじらもーど。
▼ おとめ妖怪ざくろ 関連記事
いやだから大蛇の怒りをかって酷い目に会うシーンが見たいのだが主に。
せっかくにゃのでbatで書いてみたデモ。
ADのユーザのプロパティで、ダイヤルインの静的IPアドレスを割り当てを設定
@echo off
rem (add) %0 "CN=user1,OU=ou1,OU=ou2,DC=dom,DC=local" 123.123.123.123
rem (mod) %0 "CN=user1,OU=ou1,OU=ou2,DC=dom,DC=local" 123.123.123.123
rem (del) %0 "CN=user1,OU=ou1,OU=ou2,DC=dom,DC=local"
set dn="%~1"
set ip=%~2
if %dn%=="" (@echo ERR1 : %0 %* & pause & exit)
call :chk_dn %dn%
@echo dn ok
if "%ip%"=="" call :mode_del
if not "%ip%"=="" call :mode_edit
goto :EOF
:mode_del
call :attr_del %dn% "msRADIUSFramedIPAddress"
call :attr_del %dn% "msRASSavedFramedIPAddress"
exit /b
:mode_edit
setlocal
call :ip2dec ip_dec %ip%
echo %ip% = %ip_dec%
call :attr_edit %dn% "msRADIUSFramedIPAddress" "%ip_dec%"
call :attr_edit %dn% "msRASSavedFramedIPAddress" "%ip_dec%"
endlocal
exit /b
:chk_dn
ldifde -u -d %1 -r "(objectClass=user)" -f out.tmp || goto :chk_err %*
ldifde -u -d %1 -r "(objectClass=user)" -f out.tmp | find "1個のエントリがエクスポートされました" >NUL || goto :chk_err %*
type out.tmp | find %dn% >NUL || goto :chk_err %*
del out.tmp
exit /b
:chk_err
echo ERR2 %0 %*
pause
exit
:attr_edit
setlocal
set dn="%~1"
set attr="%~2"
set var="%~3"
call :is_exist_attr flag %dn% %attr%
if "%flag%"=="0" call :create_import_file_add %dn% %attr% %var% > tmp.txt
if "%flag%"=="1" call :create_import_file_modify %dn% %attr% %var% > tmp.txt
type tmp.txt || pause
call conv.cmd sjis2unicode tmp.txt tmp_u.txt
del tmp.txt
ldifde -u -i -f tmp_u.txt || (@echo ERR3 %0 %* & pause)
del tmp_u.txt
endlocal
exit /b
:attr_del
setlocal
set dn="%~1"
set attr="%~2"
call :is_exist_attr flag %dn% %attr%
if "%flag%"=="0" exit /b
if "%flag%"=="1" call :create_import_file_delete %dn% %attr% > tmp.txt
type tmp.txt || pause
call conv.cmd sjis2unicode tmp.txt tmp_u.txt
del tmp.txt
ldifde -u -i -f tmp_u.txt || (@echo ERR4 %0 %* & pause)
del tmp_u.txt
endlocal
exit /b
:create_import_file_add
@echo off
if "%~3"=="" (@echo ERR5 %0 %* & pause)
echo.|set /p x=dn: %~1
echo.
echo.|set /p x=changetype: modify
echo.
echo.|set /p x=add: %~2
echo.
echo.|set /p x=%~2: %~3
echo.
echo.|set /p x=-
echo.
exit /b
:create_import_file_modify
@echo off
if "%~3"=="" (@echo ERR6 %0 %* & pause)
echo.|set /p x=dn: %~1
echo.
echo.|set /p x=changetype: modify
echo.
echo.|set /p x=replace: %~2
echo.
echo.|set /p x=%~2: %~3
echo.
echo.|set /p x=-
echo.
exit /b
:create_import_file_delete
@echo off
if "%~2"=="" (@echo ERR7 %0 %* & pause)
echo.|set /p x=dn: %~1
echo.
echo.|set /p x=changetype: modify
echo.
echo.|set /p x=delete: %~2
echo.
echo.|set /p x=-
echo.
exit /b
:is_exist_attr
setlocal
set res=0
set dn=%2
set attr=%3
ldifde -u -d %dn% -l %attr% -f out.tmp >NUL
type out.tmp | find %attr% >NUL && set res=1
del out.tmp
endlocal & set %1=%res%
exit /b
:hex2dec
rem call :hex2dec var ffffffff
echo.|set /p x=Wscript.Echo ^^^&H%~2>tmp.vbs
echo.>>tmp.vbs
for /f "usebackq delims=" %%a in (`cscript //nologo tmp.vbs`) do set %1=%%a
del tmp.vbs
exit /b
:dec2hex
rem call :dec2hex var 123456
echo.|set /p x=Wscript.Echo Hex(%~2)>tmp.vbs
echo.>>tmp.vbs
for /f "usebackq delims=" %%a in (`cscript //nologo tmp.vbs`) do set %1=%%a
del tmp.vbs
exit /b
:format_dec
rem call :%0 var 4 99 -> var=0099
setlocal
set x=00000000000000000000000000000000000000000000000000%3
rem call echo %%x:~-^%2%%
call set ans=%%x:~-^%2%%
endlocal & set %1=%ans%
exit /b
:split_ip4
rem call %0 var1 var2 var3 var4 123.123.123.123
for /f "tokens=1,2,3,4 delims=." %%a in ("%~5") do set %1=%%a & set
%2=%%b & set %3=%%c & set %4=%%d
exit /b
:ip2dec
setlocal
rem call %0 var 10.1.0.255
set ip=%~2
call :split_ip4 var1 var2 var3 var4 %ip%
rem echo %var1% %var2% %var3% %var4%
call :dec2hex hvar1 %var1%
call :dec2hex hvar2 %var2%
call :dec2hex hvar3 %var3%
call :dec2hex hvar4 %var4%
rem echo %hvar1% %hvar2% %hvar3% %hvar4%
call :format_dec hvar1 2 %hvar1%
call :format_dec hvar2 2 %hvar2%
call :format_dec hvar3 2 %hvar3%
call :format_dec hvar4 2 %hvar4%
rem echo %hvar1% %hvar2% %hvar3% %hvar4%
call :hex2dec var %hvar1%%hvar2%%hvar3%%hvar4%
rem echo %var%
endlocal & set %1=%var%
exit /b
setlocal的にゃ部分とかエラーチェックはいい加減にゃので、十分テストしておかにゃいとADのデータ全滅とかにゃり得る所が怖いね
ipを4つ区切りで指定するとdwordにゃintにして書き込みみたいにゃことをしてるけど、かにゃり反則気味。
あと今回は関係にゃいんだけど日本語関連でunicodeで出し入れしたほうがいいので、unicode変換とか呼んでます。
で、ここまでしといて何だけど、vbsでGetObject("LDAP://〜〜)したほうが楽だねこれは(笑)
もうすっかり史実がどうとかわからにゃくにゃった
Win鯖でPPTPにゃVPN鯖とか立ててると、接続してきたユーザには設定したIPプールからランダムにIPがわりあてられるので、特定のユーザを特定のIPでVPN接続させることが出来にゃい。
が、ADのユーザのプロパティで、ダイヤルインの静的IPアドレスを割り当てを設定すれば、優先的にこのIPを使って接続される。細かい挙動は設定出来にゃいが、とりあえず無いよりはかにゃり有用に使える。
で、このプロパティを一括で登録しようと思うと、安易にゃツールでは設定オプションが無かったりしてがっかりにゃことに。
VPNの接続許可のとこもだけど、どうせADに登録されてる情報でしかにゃいんだから、全部設定出来るようにしとけよにゃー。netsh ras set user〜〜とかいちいち別のツール持ってくる必要があってめんどくさい。
んで、もちろん無いことはにゃいわけで、ldifdeで全般的に設定出来る。csvでできるcsvdeってのもある。オールマイティにゃものが有るにゃら、もう最初からこれだけにしとけよって感じのいつものMSの無計画ノーデザインである。
で、大雑把には
特定ユーザのexport
ldifde -u -d "CN=user01,OU=ou1,OU=ou2,DC=neko,DC=local" -f out.txt
このままimportするとユーザの追加ににゃる
属性の変更
dn: CN=user01,OU=ou1,OU=ou2,DC=neko,DC=local
changetype: modify
replace: test
test: xxx
-
属性の追加
dn: CN=user01,OU=ou1,OU=ou2,DC=neko,DC=local
changetype: modify
add: test
test: xxx
-
属性の削除
dn: CN=user01,OU=ou1,OU=ou2,DC=neko,DC=local
changetype: modify
delete: test
-
とこんにゃ感じ
addで同じ属性を複数追加できちゃうので、無ければ追加とか有れば変更とかは事前に場合分けする必要がある。
ま、とりあえず設定がtextで出し入れ出来るようににゃれば、あとはどうとでもにゃるよね、というわけで。