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 のタイポじゃないかなと思います。
クリボウ様
いつも記事を見ていただきありがとうございます。
ご指摘の件、ありがとうございます。(くだらないミスでスミマセン。)
記事を修正いたしました。
今後もよろしくお願いします。