从PHP访问Windows注册表(转载)

IT视界_论坛_天涯社区

  Windows注册表是一个简单的数据库,具有分层结构的Windows操作系统和其他应用程序存储重要的配置信息。各种各样的数据存储在注册中心:用户配置文件,文件类型关联,硬件信息,序列号,和更多。可以从win32std功能扩展,您的基于windows的PHP应用程序可以访问注册表太。

  win32std的扩展可以下载预编译的库downloads.php.net/pierre/。简单地把它到你的PHP的 ext文件夹,更新你的 php.ini文件,并重新启动Apache如果必要的话。注意,现在你想下载的dll是32位的,因此,如??您正在使用一个64位的构建的WampServer或这样你就不会获得很大的成功。你大概需要下调到一个32位WampServer构建或尝试编译自己的图书馆。

  注册表布局

  注册表的美誉是对一个黑暗、危险和可怕的地方在Windows操作系统。这可能是一个过于夸张的恐惧,但我还是要重申一下微软的注册???咒语:“在你修改注册表,支持它,并确保你理解如何恢复它是否发生问题。不适当的变化会导致严重的问题,可能需要重新安装你的操作系统。”

  那么,这黑暗、可怕的地方看起来像什么?Windows注册表分为5个主要团体称为密钥:

  根键当前配置

  这个密钥存储信息的计算机的硬件如监视器分辨率和扬声器设置。你可能会看到这个缩写为HKCC关键。

  HKEY_LOCAL_MACHINE

  这主要包含配置信息的机器如打印机、软件和网络信息。关键是加载第一,然后从用户的概要条目覆盖不同的值。您将看到这个关键的缩写为HKLM。

  根键用户

  这种钥匙保存所有的概要文件为本地用户帐户的机器上。诸如用户的屏幕保护程序的选择、主题信息和其他首选项存储在这里。这个密钥被缩写为香港。

  根键类根

  这个密钥别名指向HKEY_LOCAL_MACHINE \软件商店和mime类型信息文件关联。是HKCR的缩写。

  根键当前用户

  这个密钥别名指向这个概要文件在根键用户当前登录用户。你会看到这个缩写为HKCU关键。

  每个键包含subkeys反过来包含其他subkeys,配置值,或两者兼而有之。

  工作在根键当前用户是足够去玩弄一些CLI脚本和一个沙箱。只使用为系统范围的应用程序数据和HKEY_LOCAL_MACHINE你舒适的工作情况与微软的安全权限。理解什么是适合您的情况,知道哪个账户下运行,并创建您的PHP钥匙适当。

  制作一个沙箱

  我建议设立一个特殊键用于脚本为了安全,特别是当你开发。犯错是人之常情,我们不想意外地覆盖什么重要。组织的另一个原因是建立一个指定的关键。有很多的信息存储在注册中心的,我们希望能够找到我们自己的价值观很容易。

  注册表编辑器是一个微软程序用于查看和编辑注册表。要创建我们的沙箱,去开始,输入“注册表编辑???”在搜索栏和选择 regedit.exe在结果列表中出现。

  左边的面板显示了一个树结构的现有键在右窗格中显示值存储在他们。扩大根键当前用户节点,右键单击,并选择New >软件键键从弹出上下文菜单。或者,我们也可以通过树遍历使用箭头键,这样软件关键突出显示,并选择New >键从编辑菜单。提供一个名称为键,按enter。

  现在,我们有一个玩的地方,请允许我向您介绍的功能win32std提供操作注册表项。

  从注册表中读取

  reg_open_key()函数打开一个连接到注册表并返回一个资源。此资源,然后使用其他注册表函数,在该连接上。reg_close_key()函数关闭连接。

  reg_open_key()有两个参数:第一个预定义的常量,表示五个主要的注册表,然后到所需的关键路径的剩余部分。

  $keyConst = HKEY_CURRENT_USER;

  // backslash is used as an escape so it must be escaped itself

  $key = "Software\\Intel";

  // open the registry key HKCU\Software\Intel

  if (!($reg =

@reg_open_key

($keyConst, $key))) {

  throw new Exception("Cannot access registry.");

  }

  ...

  reg_close_key($reg);

  现在,你有一个开放的连接,你可以使用reg_enum_key()中,reg_enum_value()和reg_get_value()函数从注册表中检索信息。

  如果只是资源被传递到reg_enum_key(),那么它会返回一个数组的子项,在目前的关键。一个整数值,也可以通过在一个特定的索引来检索该子项。

  // 获取数组的子项根据当前的关键

  $subkeys = reg_enum_key($reg);

  foreach ($subkeys as $index => $subkey) {

  echo "The subkey at " . $index . " is " . $subkey . "\n";

  }

  // 获得一个特定子项

  $index = 2;

  $subkey = reg_enum_key($reg, $index);

  echo "The subkey at " . $index . " is " . $subkey . "\n";

  现在,你有一个打开的连接,您可以从注册表中检索信息使用reg enum关键(),reg枚举值()和雷格获得价值()函数。

  如果只是资源传递给reg enum关键(),那么它将返回一组subkeys在当前关键。一个整数值也可以通过检索注册表子项在特定索引。

  // 获取数组的值根据给定的关键

  $values = reg_enum_value($reg);

  foreach ($values as $index => $value) {

  echo "The value at " . $index . " is " . $value . " and stores ";

  echo reg_get_value($reg, $value) . "\n";

  }

  // 获得一个给定的索引值

  $index = 1;

  $value = reg_enum_value($reg, $index);

  echo "The value at " . $index . " is " . $value . " and stores ";

  echo reg_get_value($reg, $value) . "\n";

  写入注册表

  有极少数的数据类型,你可以选择从读取和写入到注册表中。他们重新一般小的影响,因为PHPA的动态特性,但你必须到指定的类型,当你写一个值。大多数时候,你会发现自己使用REG_SZ或REG_DWORD,但此处暴露的数据类型的扩展名列表:

  REG_DWORD“值被存储为一个32位长的整数

  REG_SZ“”值被存储为一个固定长度的字符串

  REG_EXPAND_SZ“值存储为可变长度的字符串

  REG_MULTI_SZ“的值是一个由一个分隔符,如空格或逗号分隔的项目清单

  REG_BINARY“”的值是一个二进制字符串

  REG_NONE“”值没有特定的数据类型与

  reg_set_value()函数用于将值写入到注册表中。如果该值已经存在,那么新的值将覆盖它,但如果它没有存在,那么它会创建它。该函数有四个参数:第一个开放的资源,那么该值的名称,然后一个预定义的常量,表示值a的数据类型,最后是数据本身。

  $keyConst = HKEY_CURRENT_USER;

  $key = "Software\\PHPMaster";

  if (!($reg =

@reg_open_key

($keyConst, $key))) {

  throw new Exception("Cannot access registry.");

  }

  $values = array(

  array("dbDriver", REG_SZ, "mssql"),

  array("dbHost", REG_SZ, "localhost"),

  array("dbPort", REG_DWORD, 1433),

  array("dbSchema", REG_SZ, "MyAppDB"),

  array("dbUser", REG_SZ, "DBUser"),

  array("dbPass", REG_SZ, "s3cr3t"));

  foreach ($values as $value) {

  reg_set_value($reg, $value[0], $value[1], $value[2]);

  }

  reg_close_key($reg);

  一个例子——USB驱动软件狗

  您可能想知道如果有一个实际使用处理注册表。在一个基于web的应用程序,您可以存储在注册中心的配置信息。如果你写一个桌面应用程序然后注册表可能是一个好地方来存储各种信息从应用程序数据用户的喜好。Windows本身写各种各样的有趣的硬件和状态相关的信息发送到注册表,其中一些可能是有用的,如果你足够有创造力。

  假设我们的PHP应用程序已经获得许可在这样一个USB集线器需要附加到服务器来运行它。PHP如何检测软件狗的存在?Windows上的答案在于注册!每个设备有一个惟一的标识符,所以该脚本可以搜索适当的键启动时,它的标识符来确定软件狗插入或不是。

  第一步是确定设备的标识符。对于这个例子,我将使用一个商品盘。只要简单的把驱动器变成一个USB端口上计算机,然后去开始,输入“装置”在搜索栏,并选择设备管理器在结果列表中出现。

  发现设备在设备管理器,右键单击条目,然??从上下文菜单中选择Properties。然后去Details选项卡的属性窗口并选择“设备实例路径”从下拉列表中。十六进制数字序列的结尾的值是设备id(标记为红色)。

  Windows会记录下的USB设备各子项HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务。我的U盘等存储介质将出现在USBSTOR,可能会出现在其他设备usbaudio,usbccgp,并usbehci的。另外,还要注意HKEY_LOCAL_MACHINE将通俗易懂的特权帐户。

  所以,现在我们可以简单地搜索科亚�的枚举子项为设备实例。当驱动器连接时,它会被列出,当它不连接不会被上市。

  01

  02 // 设备实例ID

  03 $id = "0060E049DF74EC311000711F";

  04

  05 // 警告:必须运行与管理的privs访问这些键

  06 $keyConst = HKEY_LOCAL_MACHINE;

  07 $key = "SYSTEM\\CurrentControlSet\\services\\USBSTOR\\Enum";

  08

  09 if (!($reg = reg_open_key($keyConst, $key))) {

  10 throw new Exception("Cannot access registry.");

  11 }

  12

  13 $found = false;

  14 $numDevices = reg_get_value($reg, "Count");

  15 for ($i = 0; $i < $numDevices; $i++) {

  16 $value = reg_get_value($reg, $i);

  17 if (strpos($val, $id) !== false) {

  18 $found = true;

  19 break;

  20 }

  21 }

  22 reg_close_key($reg);

  23 echo "USB drive dongle ", ($found) ? "found" : "not found";

  这种简单的检查,还开辟了其他一些有趣的可能性,你可以很容易地编写一个敏感的管理接口,验证了加密狗,并请求从服务器本身通过检查$ _SERVER [“REMOTE_ADDR”]。这种设置将要求用户在指定的服务器,并在物理上,提供一种形式的物理验证。

  在结论

  纵观这篇文章的过程中,我们已经看到了Windows的注册表是什么,什么样的信息可以发现在一个小样本。你可以写你自己的配置数据,也可以读取信息,使用提供的功能的win32std扩展。

  原文地址:http://www.software8.co/wzjs/PHPshili/465.html

本文由 黑白世界4648 第一时间收藏到GET,原文来自 → bbs.tianya.cn

「GetParty」

关注微信号,推送好文章

微信中长按图片即可关注

更多精选文章

评论
微博一键登入