Windows10のドメイン参加スクリプトを色々参考にしながら作ってみたので備忘録がてらに。
ホスト名の下一桁で所属OUが変わります。
ドメイン参加スクリプト(VBスクリプト)
'ドメイン参加スクリプト
'ホスト名の下一桁をチェックし該当するOUにコンピューターアカウントを作成
'対応OS:Windows10用
'所属OUはWin10配下のhostNum、hostETC
'下一桁が数字じゃないコンピューターはhostETCへ
' 変数定義
Dim objShell
Dim objNetWork
Dim objComputer
Dim strComputer
Dim strDomain
Dim strOU
Dim strUser
Dim strPassword
Dim retValue
' 定数設定
Const JOIN_DOMAIN = 1
Const ACCT_CREATE = 2
Const ACCT_DELETE = 4
Const WIN9X_UPGRADE = 16
Const DOMAIN_JOIN_IF_JOINED = 32
Const JOIN_UNSECURE = 64
Const MACHINE_PASSWORD_PASSED = 128
Const DEFERRED_SPN_SET = 256
Const INSTALL_INVOCATION = 262144
' 管理者に昇格して実行
If WScript.Arguments.Count = 0 Then
Set objShell = CreateObject("Shell.Application")
objShell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """ dmyarg", "", "runas", 1
WScript.Quit
End If
' OS判定
Set oLocater = CreateObject("WbemScripting.SWbemLocator")
Set oService = oLocater.ConnectServer(".", "root/cimv2")
Set items = oService.ExecQuery("Select * From Win32_OperatingSystem", , 48)
For Each Item In items
If InStr(Item.Caption, "Windows 10") > 0 Then
Exit For
Else
WScript.echo "このスクリプトはWin10用です"
WScript.Quit
End If
Next
Set Item = Nothing
Set oService = Nothing
Set oLocater = Nothing
' ドメイン参加に必要な情報を設定
strDomain = "test.local"
strOU = "OU=Win10;OU=Client;DC=test;DC=local"
strUser = "test\pcsetup"
strPassword = "P@ssw0rd!!"
' ホスト名下一桁を変数に格納
Set objNetWork = WScript.CreateObject("WScript.Network")
strComputer= objNetWork.ComputerName
strString = Right(strComputer, 1)
' ドメイン参加処理(ホスト名に適したOUへ)
if IsNumeric(strString) = true Then
strOU = "OU=hostNum" & ";" & strOU
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!//" & strComputer & "/root/cimv2:Win32_ComputerSystem.Name='" & strComputer & "'")
retValue = objComputer.JoinDomainOrWorkgroup(strDomain, strPassword, strUser, strOU, JOIN_DOMAIN + ACCT_CREATE)
Else
strOU = "OU=hostETC" & ";" & strOU
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!//" & strComputer & "/root/cimv2:Win32_ComputerSystem.Name='" & strComputer & "'")
retValue = objComputer.JoinDomainOrWorkgroup(strDomain, strPassword, strUser, strOU, JOIN_DOMAIN + ACCT_CREATE)
End if
If retValue <> 0 Then
WScript.echo "ドメイン参加に失敗(" & retValue & ")"
Else
WScript.echo "ドメイン参加に成功" & vbCrLF & "OKをクリック後、5秒後に再起動します"
WScript.sleep(5000)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Shutdown)}!\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOperatingSystem in colOperatingSystems
objOperatingSystem.Reboot()
Next
End If
- ユーザーID、パスワード埋め込み型なので、一般ユーザーに使ってもらうにはソースは難読化または暗号化した方がいいかもしれませんね。
- AD上にコンピューターアカウントがないことが前提です。
JoinDomainOrWorkgroupの戻り値
0:成功。
5:アクセス拒否。
87:パラメーターが間違っている。
110:指定されたオブジェクトを開くことができません。
1323:パスワードを更新できません。
1326:ログオン失敗。ユーザー名かパスワードが間違っています。
1355:指定したドメインが存在しないか、接続できませんでした。
2224:コンピューターアカウントが既に存在します。
2691:ドメインに参加済みです。
2692:ドメインに参加していません。
この戻り値を使って処理の分岐を増やすとさらにユーザーフレンドリーなスクリプトになります。