朝起きて、「今日は何か狂ったことをしたいですか?」と思ったことはありますか?さて、今日がその朝の1つだったら、あなたは幸運です。 PHPを使用してWindowsレジストリへのアクセスについて少し紹介したいと思います。 PHP…レジストリ…クレイジー!
Windowsレジストリは、Windowsオペレーティングシステムやその他のアプリケーションが重要な構成情報を保存する階層構造化データベースです。 あらゆる種類のデータは、ユーザープロファイル、ファイルタイプの関連付け、ハードウェア情報、シリアル番号などのレジストリに保存されます。 Win32std拡張機能から利用可能な関数を使用すると、WindowsベースのPHPアプリケーションもレジストリにアクセスできます。
win32std拡張機能は、downloads.php.net/pierre/から事前にコンパイルされたライブラリとしてダウンロードできます。 PHPのExtフォルダーにドロップし、PHP.iniファイルを更新し、必要に応じてApacheを再起動します。ダウンロードするDLLは32ビットであるため、WampServerなどの64ビットビルドを使用している場合、あまり成功することはありません。 Wampserverを32ビットにダウングレードするか、自分でライブラリをコンパイルする必要があります。
レジストリは、Windowsオペレーティングシステムの暗くて危険で怖い場所であるという評判があります。 これはおそらく誇張された恐怖ですが、それでもマイクロソフトのレジストリマントラを繰り返します。 不適切な変更は、オペレーティングシステムを再インストールする必要がある可能性のある深刻な問題を引き起こす可能性があります。」
それで、この暗くて怖い場所はどのように見えますか? Windowsレジストリは、キーとして知られる5つの主要なグループに分割されます。
HKEY_CURRENT_CONFIG hkey_local_machine
このキーには、プリンター、ソフトウェア、ネットワーキング情報など、マシンの構成情報が含まれています。 キーは最初にロードされ、次にユーザーのプロファイルからのエントリがさまざまな値をオーバーライドします。 このキーはHKLMとして略されていることがわかります。
hkey_users
このキーは、マシン上のローカルユーザーアカウントのすべてのプロファイルを保持しています。 ユーザーのスクリーンセーバーの選択、テーマ情報、その他の設定などがここに保存されます。 このキーはHKUとして略されます。
HKEY_CLASSES_ROOT hkey_current_user このキーは、現在ログインしているユーザーのhkey_usersのプロファイルを指すエイリアスです。 このキーはHKCUとして略されていることがわかります。
各キーには、他のサブキー、構成値、またはその両方を含むサブキーが含まれています。
hkey_current_userの下で作業するだけで、いくつかのCLIスクリプトとサンドボックスをいじくり回すのに十分です。 Microsoftのセキュリティ許可を快適に操作するシステム全体のアプリケーションデータと状況には、hkey_local_machineのみを使用します。あなたの状況に正しいことを理解し、どのアカウントPHPが実行されているかを知り、キーを適切に作成します。
サンドボックスの作成
特に開発する場合は、安全のためにスクリプトで使用するために特別なキーを設定することをお勧めします。エラーは人間であり、私たちは誤って重要なものを上書きしたくありません。 組織は、指定されたキーを設定するもう1つの理由です。 レジストリには多くの情報が保存されており、自分の価値を簡単に見つけることができるようにしたいと考えています。
レジストリエディターは、レジストリを表示および編集するために使用されるMicrosoftプログラムです。サンドボックスを作成するには、開始し、検索バーの「Regedit」と入力し、表示される結果リストでRegedit.exeを選択します。
左ペインには既存のキーのツリー構造が表示され、右ペインには内部に保存されている値が表示されます。 hkey_current_userノードを展開し、ソフトウェアキーを右クリックして、ポップアップコンテキストメニューから[新しい>キー]を選択します。 または、矢印キーを使用してツリーを通過して、ソフトウェアキーが強調表示され、[編集]メニューから[新しいキー]を選択するようにすることもできます。キーの名前を提供し、Enterを押します。

プレイする場所があるので、Win32stDがレジストリエントリを操作するためにオファーを提供する機能を紹介してください。
レジストリからの読み取り
reg_open_key()関数は、レジストリへの接続を開き、リソースを返します。 このリソースは、他のレジストリ関数とともに使用され、その接続に作用します。 reg_close_key()関数は接続を閉じます。
reg_open_key()は、2つの引数を取ります。最初は、5つの主要なレジストリグループの1つを表す定義済み定数、次に目的のキーへのパスの残りです。
オープン接続ができるようになったので、reg_enum_key()、reg_enum_value()、reg_get_value()関数を使用してレジストリから情報を取得できます。
リソースがreg_enum_key()に渡される場合、現在のキーの下にサブキーの配列が返されます。 特定のインデックスでサブキーを取得するために、整数値を渡すこともできます。
<span><span><?php
</span></span><span><span>$keyConst = HKEY_CURRENT_USER;
</span></span><span>
</span><span><span>// backslash is used as an escape so it must be escaped itself
</span></span><span><span>$key = "Software\Intel";
</span></span><span>
</span><span><span>// open the registry key HKCUSoftwareIntel
</span></span><span><span>if (!($reg = @reg_open_key($keyConst, $key))) {
</span></span><span> <span>throw new Exception("Cannot access registry.");
</span></span><span><span>}
</span></span><span><span>...
</span></span><span>
</span><span><span>reg_close_key($reg);</span></span>
reg_enum_key()がキーを返すと、reg_enum_value()がキーの値を返します。 この関数は、リソースとオプションのインデックスを受け入れます。値名をreg_get_value()に渡すことができます。
<span><span><?php
</span></span><span><span>// retrieve an array of subkeys under the current key
</span></span><span><span>$subkeys = reg_enum_key($reg);
</span></span><span><span>foreach ($subkeys as $index => $subkey) {
</span></span><span> <span>echo "The subkey at " . $index . " is " . $subkey . "n";
</span></span><span><span>}
</span></span><span>
</span><span><span>// retrieve a specific subkey
</span></span><span><span>$index = 2;
</span></span><span><span>$subkey = reg_enum_key($reg, $index);
</span></span><span><span>echo "The subkey at " . $index . " is " . $subkey . "n";</span></span>
<span><span><?php
</span></span><span><span>// retrieve an array of values under a given key
</span></span><span><span>$values = reg_enum_value($reg);
</span></span><span><span>foreach ($values as $index => $value) {
</span></span><span> <span>echo "The value at " . $index . " is " . $value . " and stores ";
</span></span><span> <span>echo reg_get_value($reg, $value) . "n";
</span></span><span><span>}
</span></span><span>
</span><span><span>// retrieve a specific value given the index
</span></span><span><span>$index = 1;
</span></span><span><span>$value = reg_enum_value($reg, $index);
</span></span><span><span>echo "The value at " . $index . " is " . $value . " and stores ";
</span></span><span><span>echo reg_get_value($reg, $value) . "n";</span></span>
レジストリへの書き込み
レジストリを読んで書き込むときに選択できるデータ型はいくつかあります。 PHPの動的な性質のために、一般的にほとんど結果はほとんどありませんが、値を書くときにタイプを指定する必要があります。ほとんどの場合、reg_szまたはreg_dwordを使用していることに気付くでしょうが、拡張機能によって公開されているデータ型のリストを次に示します。
reg_dword - 値は32ビットの長い整数として保存されます-
reg_sz - 値は固定長文字列として保存されます-
reg_expand_sz - 値は可変長文字列- として保存されます
reg_multi_sz - 値は、スペースやコンマなどの区切り文字で区切られたアイテムのリストです-
reg_binary - 値はバイナリ文字列- です
reg_none - 値には特定のデータ型が関連付けられていません-
reg_set_value()関数は、レジストリに値を書き込むために使用されます。値が既に存在する場合、新しい値はそれを上書きしますが、それが存在しない場合、それはそれを作成します。 この関数は、最初にオープンリソース、次に値の名前、次に値のデータ型を表す定義済み定数、最後にデータ自体を4つの引数を取ります。
<span><span><?php
</span></span><span><span>$keyConst = HKEY_CURRENT_USER;
</span></span><span>
</span><span><span>// backslash is used as an escape so it must be escaped itself
</span></span><span><span>$key = "Software\Intel";
</span></span><span>
</span><span><span>// open the registry key HKCUSoftwareIntel
</span></span><span><span>if (!($reg = @reg_open_key($keyConst, $key))) {
</span></span><span> <span>throw new Exception("Cannot access registry.");
</span></span><span><span>}
</span></span><span><span>...
</span></span><span>
</span><span><span>reg_close_key($reg);</span></span>
例 - USBドライブドングル
レジストリを操作するための実用的な使用があるかどうか疑問に思うかもしれません。 Webベースのアプリケーションでは、構成情報をレジストリに保存できます。デスクトップアプリケーションを作成した場合、レジストリは、アプリケーションデータからユーザー設定まであらゆる種類の情報を保存するのに適した場所になる可能性があります。 Windows自体は、あらゆる種類の興味深いハードウェアと状態関連情報をレジストリに書き込みます。
PHPアプリケーションが、それを実行するためにサーバーに接続する必要があるような方法で当社のPHPアプリケーションがライセンスされているとします。 PHPはドングルの存在をどのように検出できますか? Windowsの答えはレジストリにあります!各デバイスには一意の識別子があるため、スクリプトは、ドングルがプラグインされているかどうかを判断するために起動するときに識別子の適切なキーを検索できます。
最初のステップは、デバイスの識別子を決定することです。この例では、商品サムドライブを使用します。ドライブをコンピューターのUSBポートに接続してから開始し、検索バーに「デバイス」と入力し、表示される結果リストでデバイスマネージャーを選択します。
デバイスマネージャーでデバイスを見つけ、エントリを右クリックし、コンテキストメニューから[プロパティ]を選択します。次に、[プロパティ]ウィンドウの[詳細]タブに移動し、ドロップダウンリストから[デバイスインスタンスパス]を選択します。値の終わりに向けた16進数のシーケンスは、デバイスID(赤でマークされています)です。

Windowsは、hkey_local_machinesystemcurrentcontrolsetservicesのさまざまなサブキーの下でUSBデバイスの存在を記録します。私のサムドライブのようなストレージメディアは、USBSTORの下に表示されます。他のデバイスは、USBaudio、USBCCGP、およびUSBEHCIに表示される場合があります。また、hkey_local_machineはアクセスして特権的なアカウントのみになることに注意してください。
そのため、デバイスインスタンスのキーのenumサブキーを単純に検索できます。ドライブが添付されると、リストされ、添付されていない場合はリストされません。
<span><span><?php
</span></span><span><span>$keyConst = HKEY_CURRENT_USER;
</span></span><span>
</span><span><span>// backslash is used as an escape so it must be escaped itself
</span></span><span><span>$key = "Software\Intel";
</span></span><span>
</span><span><span>// open the registry key HKCUSoftwareIntel
</span></span><span><span>if (!($reg = @reg_open_key($keyConst, $key))) {
</span></span><span> <span>throw new Exception("Cannot access registry.");
</span></span><span><span>}
</span></span><span><span>...
</span></span><span>
</span><span><span>reg_close_key($reg);</span></span>
この簡単なチェックは、他の興味深い可能性も開かれます。ドングルを検証する機密の管理者専用インターフェイスを簡単にコーディングでき、$ _server ["remote_addr"]をチェックすることにより、リクエストがサーバー自体から送信されます。このセットアップでは、ユーザーが指定されたサーバーで物理的におよびで物理認証の形式を提供する必要があります。
結論
この記事の過程で、Windowsレジストリとは何か、その中にどの情報が見つかるかについての小さなサンプルが見られました。独自の構成データを記述することも、Win32stD拡張子によって提供された関数を使用して、情報を読み返すこともできます。
ちなみに、Win32stD拡張機能は、レジストリへのアクセスだけではありません。興味のある方は、wildphp.free.fr/wiki/doku.php?id=win32std:indexをチェックして、他に何が提供されるかを確認してください。
Fotoliaを介した画像
php からのWindowsレジストリへのアクセスに関するよくある質問(FAQ)
PHPからWindowsレジストリにアクセスするにはどうすればよいですか?
PHPからWindowsレジストリにアクセスするには、PHPのCOMクラスを使用することで実現できます。このクラスにより、PHPはWindowsレジストリを含む任意のCOMオブジェクトと対話できます。 COMクラスの新しいインスタンスを作成してから、RegReadメソッドを使用してレジストリから値を読み取ることができます。ただし、この方法ではレジストリにアクセスするために正しい権限が必要であることに注意してください。これは、オペレーティングシステムとレジストリを使用することを選択したアプリケーションに低レベルの設定を保存します。システム情報を取得したり、特定のソフトウェアの存在を確認したり、システム設定を変更するなど、さまざまな理由でPHPからアクセスする必要がある場合があります。ただし、システムの操作に影響を与える可能性があるため、レジストリの変更は注意して実行する必要があります。PHPからWindowsレジストリに書き込みますか? comクラスのregwriteメソッドを使用したphp。ただし、誤った修正により、オペレーティングシステムを再インストールする必要がある深刻な問題を引き起こす可能性があるため、これは非常に注意してください。 PHPからWindowsレジストリにアクセスするには、どのような権限がありますか?
PHPからWindowsレジストリにアクセスするには、管理特権が必要です。これは、レジストリに重要なシステムとアプリケーションの設定が含まれているためです。 Webサーバーからスクリプトを実行している場合、サーバーのユーザーアカウントには必要なアクセス許可も必要です。キーと値を備えた木として階層的に編成されています。キーはフォルダーに似ており、値はキー内のデータエントリです。各キーにサブキーを含めることができ、各サブキーにはさらにサブキーが含まれ、ツリー構造を形成できます。 PHP、エラーは標準のPHPエラー処理機能を使用して処理できます。たとえば、set_error_handler関数を使用してカスタムエラーハンドラーを定義できます。非ワインドシステムのPHPからのレジストリ。 Windowsレジストリは、Windowsオペレーティングシステムに固有の機能です。 comオブジェクト。 com(コンポーネントオブジェクトモデル)は、Microsoftによって導入されたソフトウェアコンポーネントのバイナリインターフェイス標準です。 Windowsレジストリを含むPHPが任意のcomオブジェクトと対話することができます。 。これは、comクラスのregdeleteメソッドを使用して実行できます。ただし、間違ったキーを削除すると深刻な問題を引き起こす可能性があるため、これは非常に注意してください。
Windowsレジストリの変更のリスクは何ですか?誤った変更は、オペレーティングシステムを再インストールする必要がある可能性のある深刻な問題を引き起こす可能性があります。したがって、変更を加える前にレジストリをバックアップし、自分がしていることに自信がある場合にのみ変更を加えることをお勧めします。
以上がPHPマスター| PHPでWindowsレジストリにアクセスしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。