コマンドプロンプトからPowerShellスクリプトを実行する方法

この記事では、コマンドプロンプト(cmd)を通じてPowerShellスクリプトを実行する方法について説明します。このアプローチは、セキュリティ制限を回避し、特定のタスクを効率的に実行するための手段となります。

最初に、自動アクティベーションシステムのcmdスクリプトを作成しようとした際、構造化プログラミングができないという問題に直面しました。これは、関数の定義が困難で、ラベルを使用して代替する必要があるためです。これにより、コードの管理が複雑になります。

その後、PowerShellを使用してスクリプトを書こうと試みましたが、セキュリティポリシーによりスクリプトが実行できず、数字署名が必要な状況になりました。これは、友人にとって使い勝手が悪いです。

そこで、コマンドプロンプトからPowerShellスクリプトを呼び出す方法を検討しました。この方法では、PowerShellスクリプトをテキストファイルに保存し、それを読み込んでコマンドプロンプトから実行します。

以下は、PowerShellスクリプトの例です。

$pkeys = @{
    'Windows Server 2022 Standard' = 'VDYBN-27WPP-V4HQT-9VMD4-VMK7H';
    'Windows Server 2022 Datacenter' = 'WX4NM-KYWYW-QJJR4-XV3QB-6VM33';

    'Windows Server 2019 Datacenter' = 'WMDGN-G9PQG-XVVXX-R3X43-63DFG';
    'Windows Server 2019 Standard' = 'N69G4-B89J2-4G8F4-WWYCC-J464C';
    'Windows Server 2019 Essentials' = 'WVDHN-86M7X-466P6-VHXV7-YY726';

    'Windows Server 2016 Datacenter' = 'CB7KF-BWN84-R7R2Y-793K2-8XDDG';
    'Windows Server 2016 Standard' = 'WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY';
    'Windows Server 2016 Essentials' = 'JCKRF-N37P4-C2D82-9YXRT-4M63B';

    'Windows 11 Pro' = 'W269N-WFGWX-YVC9B-4J6C9-T83GX';
    'Windows 11 Pro Education' = '6TP4R-GNPTD-KYYHQ-7B7DP-J447Y';
    'Windows 11 Education' = 'NW6C2-QMPVW-D7KKK-3GKT6-VCFB2';
    'Windows 11 Enterprise' = 'NPPR9-FWDCX-D2C8J-H872K-2YT43';

    'Windows 10 Pro' = 'W269N-WFGWX-YVC9B-4J6C9-T83GX';
    'Windows 10 Enterprise' = 'NPPR9-FWDCX-D2C8J-H872K-2YT43';
    'Windows 10 Education' = 'NW6C2-QMPVW-D7KKK-3GKT6-VCFB2';

    'Windows 8.1 Professional' = 'GCRJD-8NW9H-F2CDX-CCM8D-9D6T9';
    'Windows 8.1 Enterprise' = 'MHF9N-XY6XB-WVXMC-BTDCT-MKKG7';

    'Windows 7 Professional' = 'FJ82H-XT6CR-J8D7P-XQJJ2-GPDD4';
    'Windows 7 Enterprise' = '33PXH-7Y6KF-2VJC9-XBBR8-HVTHH';
};

$product = (Get-ItemProperty -Path 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion' -Name ProductName).ProductName;
echo $product;

if($pkeys.ContainsKey($product)){
    $key = $pkeys[$product];
    $slmgr = $Env:windir + '\System32\slmgr.vbs';
    cscript $slmgr //nologo /upk;
    cscript $slmgr //nologo /ipk $key;
    cscript $slmgr //nologo /skms xxx.xxx.xxx;
    cscript $slmgr //nologo /ato;
}

このスクリプトは通常のPowerShellスクリプトと異なり、各行の末尾にセミコロンが追加されており、文字列は単引号を使用しています。これは、外側のcmdで使用されるダブルクォートを避けるためです。

次に、main.batファイルを作成し、PowerShellスクリプトを読み込みます。

@echo off

set src=
setlocal enableDelayedExpansion
for /f "tokens=* delims=" %%a in (%~dp0\ps.txt) do (
    set "line=%%a"
    set "src=!src!!line!"
)

powershell -NoLogo -command "%src%" 

pause
echo on

このバッチファイルは、ps.txtに保存されたPowerShellスクリプトを読み込み、1行ずつ結合してpowershell -commandで実行します。これにより、セキュリティ制限を回避できます。

最後に、main.batを管理者権限で実行し、ps.txt内のxxx.xxx.xxxを実際のKMSサーバーに置き換えます。KMSサーバーを自前で構築したくない場合は、以下のリンクから利用可能なKMSサーバーを見つけることができます。

https://www.coolhub.top/tech-articles/kms_list.html

タグ: PowerShell cmd スクリプト セキュリティ Windows

7月25日 22:18 投稿