Share via


【☆ミ】 スクリプトセンターと Windows PowerShell のススメ

どの編でもいいのでITPro道場を受講いただいた方は道場で使っているスクリプトの有効性は感じていただいていると思います。で、今日は運用管理編に追加したドメイン参加のスクリプトをどう導き出したかをちょっと整理してみようと思いました。ここには免責事項は書きませんが、スクリプトセンターに準じます。

私の参照する先は TechNet のスクリプトセンター
カテゴリー別一覧のところを参照。
スクリプト一覧から Active Directory、コンピュータアカウントと進む。
コンピュータのドメインへの追加をチェック。

こんなスクリプトが書いてある。

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
strDomain   = "FABRIKAM"
strPassword = "ls4k5ywA"
strUser     = "shenalan"
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
                   strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
                   strComputer & "'")
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
                                                strPassword, _
                                                strDomain & "\" & strUser, _
                                                NULL, _
                                                JOIN_DOMAIN + ACCT_CREATE)

で、strDomain/strPassword/strUser の右辺を道場のものに置き換え。
実行してみると再起動しない。。。

そこで、デスクトップ管理・スタートアップとシャットダウン・コンピュータの再起動から下記を入手。

strComputer = "atl-dc-01"
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

で、マージしてできたのがこれ。

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
 
strDomain = "EXAMPLE"
strPassword = "P@ssw0rd"
strUser = "administrator"
 
Set objNetwork = CreateObject("WScript.Network")
strComputer = objNetwork.ComputerName
 
Set objComputer = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & _
    strComputer & "\root\cimv2:Win32_ComputerSystem.Name='" & _
        strComputer & "'")
 
ReturnValue = objComputer.JoinDomainOrWorkGroup(strDomain, _
    strPassword, strDomain & "\" & strUser, NULL, _
        JOIN_DOMAIN + ACCT_CREATE)

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

組合わせただけで難しいことはしてません。で、これがちゃんと今日伺った新桐生のお客様先の道場でも動きました。
こういうケースっていっぱいあると思います。必ずや役に立つと思いますから スクリプトセンター を引き続きよろしくお願いします。

これでも嫌だという方には Windows PowerShell (旧称:Monad)でしょう。Windows上で動作するシェルでコマンドを使ってオブジェクト操作もできる優れものです。
こちらに関してはIT雑誌に掲載されている少し前の田辺の記事彼のブログを参照ください。

とにかくミスを防ぎ、時間を稼げる手技をうまく使いましょう!のススメでした。 

P.S. Windows サーバークックブック もよろしく!