WindowsとOffice のプロダクトキーを調べるバッチを作った
おはようございます。
特にインフラ管理者という訳ではないんですが
何故か調べさせられることになったのでバッチ作りました。
忘れたころに調べてほしいとかってなることが多いので
バッチとかで残しておくといいですよね。
※Windows 7、8、10でしか確認していません。
スポンサーリンク
目次
Windowsのプロダクトキー
次のコードをテキストエディタなどに貼り付け、名前を付けて保存する。
バッチファイル
GetWinProductId.bat
@echo off SET TM=%TIME:~0,6% SET TM=%TM::=% SET TM=%TM: =0% SET YMD=%Date:~0,4%%Date:~5,2%%Date:~8,2%%TM% SET OUT_FILE=%COMPUTERNAME%_WinProductKey_%YMD%.txt :LA_STARTBATCH cls echo. SET /p choice=Windows のプロダクトキーを出力します、よろしいですか? [y,n] ⇒ if '%choice%'=='' goto LA_STARTBATCH REM コマンドチェック call :LA_CHECK_COMAND yn if '%choice%'=='n' goto LA_CANCEL if '%choice%'=='y' goto LA_EXEXUTE :LA_EXEXUTE echo 処理を開始します。 %DATE% %TIME% > %OUT_FILE% echo. >> %OUT_FILE% echo ホスト名:%COMPUTERNAME% >> %OUT_FILE% call search.vbs %OUT_FILE% echo. >> %OUT_FILE% goto :LA_ENDBATCH REM * ========================================================================================================= REM * コマンドチェック REM * ========================================================================================================= :LA_CHECK_COMAND echo %1 > tmp.text SET RET= FOR /F "usebackq" %%t IN (`findstr %choice% tmp.text`) DO SET RET=%%t del tmp.text if '%RET%'=='' ( goto LA_INPUT_MISSING ) exit /b REM * ========================================================================================================= REM * 入力ミス REM * ========================================================================================================= :LA_INPUT_MISSING echo. set /p miss=入力に誤りがあります。 goto LA_STARTBATCH REM * ========================================================================================================= REM * バッチ終了 REM * ========================================================================================================= :LA_ENDBATCH echo. >> %OUT_FILE% echo =============================================================================================================== >> %OUT_FILE% echo. >> %OUT_FILE% echo 処理を終了します。 %DATE% %TIME% >> %OUT_FILE% echo. SET /p choise=%CD%\%OUT_FILE% を出力しました。 exit REM * ========================================================================================================= REM * バッチ終了 REM * ========================================================================================================= :LA_CANCEL echo. SET /p choise=処理をキャンセルしました。 exit
検索用 VBScript
search.vbs
Option Explicit '宣言 Dim strKeyPath, strValueName, strComputer, strProductKey, strFinalKey, strAll Dim objReg, WshShell Dim i, k, j Dim iValues(), arrDPID, arrChars Dim objFso, objFile Set WshShell = CreateObject("wscript.shell") strComputer = "." Set objReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\default:StdRegProv") const HKEY_LOCAL_MACHINE = &H80000002 'レジストリ取得 strKeyPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion" strValueName = "DigitalProductId" objReg.GetBinaryValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, iValues arrDPID = Array() For i = 52 to 66 ReDim Preserve arrDPID( UBound(arrDPID) + 1 ) arrDPID( UBound(arrDPID) ) = iValues(i) Next '展開 arrChars = Array("B","C","D","F","G","H","J","K","M","P","Q","R","T","V","W","X","Y","2","3","4","6","7","8","9") For i = 24 To 0 Step -1 k = 0 For j = 14 To 0 Step -1 k = k * 256 Xor arrDPID(j) arrDPID(j) = Int(k / 24) k = k Mod 24 Next strProductKey = arrChars(k) & strProductKey If i Mod 5 = 0 And i <> 0 Then strProductKey = "-" & strProductKey Next strFinalKey = strProductKey strAll = strAll & strFinalKey Set objFso = CreateObject("Scripting.FileSystemObject") Set objFile = objFso.OpenTextFile(WScript.Arguments(0), 8, True) If Err.Number > 0 Then WScript.Echo "Open Error" Else objFile.WriteLine "プロダクトキー:" & strAll End If objFile.Close Set objFile = Nothing Set objFso = Nothing 'msgBox strAll, , "Microsoft Windows ProductKey" WScript.Quit
下5ケタのみ調べる
既にプロダクトIDは一覧で管理しているが、
どのPCがどのプロダクトIDかわからない場合は次のコマンドで十分。
コマンドプロンプトから次のコマンドを実行する。
slmgr /dlv cscript c:\windows\system32\slmgr.vbs /dlv
Microsoft Office
バッチファイル
次のコードをテキストエディタに貼り付け、名前を付けて保存する。
GetOfficeProductKey.bat
@echo off SET TM=%TIME:~0,6% SET TM=%TM::=% SET TM=%TM: =0% SET YMD=%Date:~0,4%%Date:~5,2%%Date:~8,2%%TM% SET OUT_FILE=%COMPUTERNAME%_Office_%YMD%.txt :LA_STARTBATCH cls echo. SET /p choice=Office のプロダクトキーを出力します、よろしいですか? [y,n] ⇒ if '%choice%'=='' goto LA_STARTBATCH REM コマンドチェック call :LA_CHECK_COMAND yn if '%choice%'=='n' goto LA_CANCEL if '%choice%'=='y' goto LA_EXEXUTE :LA_EXEXUTE echo 処理を開始します。 %DATE% %TIME% > %OUT_FILE% echo. >> %OUT_FILE% echo ホスト名:%COMPUTERNAME% >> %OUT_FILE% echo ============================================= Office Information ============================================== >> %OUT_FILE% REM ------------------------------------------------------ REM Officeの情報を出力する REM ------------------------------------------------------ if Exist "%programfiles(x86)%" ( if Exist "%programfiles(x86)%\Microsoft Office\Office14\ospp.vbs" ( cscript "%programfiles(x86)%\Microsoft Office\Office14\ospp.vbs" /dstatus >> %OUT_FILE% ) else ( cscript "%programfiles(x86)%\Microsoft Office\Office15\ospp.vbs" /dstatus >> %OUT_FILE% ) ) else ( if Exist "%programfiles%\Microsoft Office\Office14\ospp.vbs" ( cscript "%programfiles%\Microsoft Office\Office14\ospp.vbs" /dstatus >> %OUT_FILE% ) else ( cscript "%programfiles%\Microsoft Office\Office15\ospp.vbs" /dstatus >> %OUT_FILE% ) ) REM ファイルの内容を読み込んでチェック for /f "delims=" %%a in (%OUT_FILE%) do ( echo %%a | find "Last 5 characters of installed product key" >NUL IF NOT ERRORLEVEL 1 call :LA_CHECK "%%a" ) goto :LA_ENDBATCH REM * ========================================================================================================= REM * コマンドチェック REM * ========================================================================================================= :LA_CHECK_COMAND echo %1 > tmp.text SET RET= FOR /F "usebackq" %%t IN (`findstr %choice% tmp.text`) DO SET RET=%%t del tmp.text if '%RET%'=='' ( goto LA_INPUT_MISSING ) exit /b REM * ========================================================================================================= REM * 入力ミス REM * ========================================================================================================= :LA_INPUT_MISSING echo. set /p miss=入力に誤りがあります。 goto LA_STARTBATCH REM * ========================================================================================================= REM * office プロダクトキーの出力 REM * ========================================================================================================= :LA_CHECK set VAL=%~1 echo. >> %OUT_FILE% echo ++++++++++++++ レジストリを検索 +++++++++++++++++ >> %OUT_FILE% echo. >> %OUT_FILE% reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office" /f *%VAL:~-5%* /s >> %OUT_FILE% exit /b REM * ========================================================================================================= REM * バッチ終了 REM * ========================================================================================================= :LA_ENDBATCH echo. >> %OUT_FILE% echo =============================================================================================================== >> %OUT_FILE% echo. >> %OUT_FILE% echo 処理を終了します。 %DATE% %TIME% >> %OUT_FILE% echo. SET /p choise=%CD%\%OUT_FILE% を出力しました。 exit REM * ========================================================================================================= REM * バッチ終了 REM * ========================================================================================================= :LA_CANCEL echo. SET /p choise=処理をキャンセルしました。 exit
まとめ
あまり使いどころがあるものではありませんが、
どこかの誰かのお役に立てれば幸いです。
ではでは。
ディスカッション
コメント一覧
有益な情報ありがとうございます。
GetWinProductId.bat のコード、25 行目 seach は search のタイポじゃないかなと思います。
クリボウ様
いつも記事を見ていただきありがとうございます。
ご指摘の件、ありがとうございます。(くだらないミスでスミマセン。)
記事を修正いたしました。
今後もよろしくお願いします。