WindowsとOffice のプロダクトキーを調べるバッチを作った

2017年6月4日Windows,Windows DOS,小ネタ

おはようございます。

特にインフラ管理者という訳ではないんですが
何故か調べさせられることになったのでバッチ作りました。

忘れたころに調べてほしいとかってなることが多いので
バッチとかで残しておくといいですよね。

※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

 

まとめ

あまり使いどころがあるものではありませんが、
どこかの誰かのお役に立てれば幸いです。

ではでは。

スポンサーリンク


関連するコンテンツ

2017年6月4日Windows,Windows DOS,小ネタBatch,DOS,Windows,バッチ,プロダクトキー

Posted by doradora