操作注册表系列

一、注册表简介

windows的注册表主要存储了计算机的各种配置信息,包括各种软件安装信息,系统外观,系统软件运行等等。

注册表按层次结构来组织,由项、子项、配置单元和值项组成。

注册表中包括如下各项:
  ●HKEY_CURRENT_USER:包含当前登录用户的配置信息的根目录。用户文件夹、屏幕颜色和“控制面板”设置存储在此处。该信息被称为用户配置文件。
  ●HKEY_USERS:包含计算机上所有用户的配置文件的根目录。HKEY_CURRENT_USER是HKEY_USERS的子项。
  ●HKEY_LOCAL_MACHINE:包含针对该计算机(对于任何用户)的配置信息。
  ●HKEY_CLASSES_ROOT:是HKEY_LOCAL_MACHINE\Software的子项。此处存储的信息可以确保当使用Windows资源管理器打开文件时,将使用正确的应用程序打开对应的文件类型。
  ●HKEY_CURRENT_CONFIG:包含本地计算机在系统启动时所用的硬件配置文件信息。

二、程序思路

现在有个需求,需要通过程序实现检测系统注册表中,是否已经将相应的网站添加至信任站点并打开activex的功能。网页上通常JavaScript调用Shell实现,由于需要调用activex控件,所以如果未打开客户端IE中关于activex的限制,则会报出错误。

信任站点的注册表项如下

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range[*]

ActiveX的注册表项

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4]\[*]

-------------------------------------------------------------------------------------------------------------

[0-4]

值 设置

------------------------------

0 我的电脑

1 本地 Intranet 区域

2 受信任的站点区域

3 Internet 区域

4 受限制的站点区域

[*]

1001 下载已签名的 ActiveX 控件

1004 下载未签名的 ActiveX 控件

1200 运行 ActiveX 控件和插件

1201 对没有标记为安全的 ActiveX 控件进行初始化和脚本运行

1405 对标记为可安全执行脚本的 ActiveX 控件执行脚本

2201 ActiveX 控件自动提示 **

----------------------------------------------------------------------------------------

js中操纵注册表主要用到WScript.Shell

写操作RegWrite(注册表中项的路径,值,类型(例如REG_DWORD))

读操作RegRead(注册表中项的路径)

删除操作RegDelete(注册表中项的路径)

该程序主要用到的是读操作,具体的实现代码如下

ContractedBlock.gif ExpandedBlockStart.gif Code
function checkRegistry()
          {
                
var text = "注册表导入失败,可能的原因有以下几种:\r\n\r\n" 
                
+ "********************************************\r\n" 
                  
+ "* 1、您当前的用户不是管理员权限;          *\r\n" 
                  
+ "* 2、您系统中的防火墙或杀毒软件阻止了修改;*\r\n" 
                  
+ "* 3、您的注册表已被锁定;                  *\r\n"
                  
+ "*    请速与系统管理员联系!                *\r\n"
                  
+ "********************************************" 
            
try
            {
                
var WshShell = new ActiveXObject("WScript.Shell");
                
var ip1 = WshShell.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range9\\:Range");
                
var ip2 = WshShell.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range19\\:Range");
                
if( ip1 != "XXXXXXX" || ip2  != "XXXXXXXXXXXX")
                    alert(text);
                
else
                    alert(
"Success!");
            }
            
catch(e)
            {
                alert(text);
            }
          }

如果需要在桌面端实现该功能,能用到的语言就太多了。这里主要讲用一种独特的语言来实现,叫做AutoIt。安装之后就可以在它的IDE环境里开发了。代码如下

ContractedBlock.gif ExpandedBlockStart.gif Code
;打开注册表锁
Func EnableRegistry()
    RegWrite(
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System""DisableRegistryTools""REG_DWORD""00000001")
    $isLock 
= RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System""DisableRegistryTools")
    If $isLock 
= 1 Then
        RegDelete(
"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System""DisableRegistryTools")
    EndIf
EndFunc   ;
==>EnableRegistry
;读取注册表键值
Func GetValueByKey($keyName, $valueName)
    $key 
= "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"
    $
var = RegRead($key & $keyName, $valueName)
    Return $
var
EndFunc   ;
==>GetValueByKey
Func CheckRegistry()
    $ip1 
= GetValueByKey("ZoneMap\Ranges\Range19"":Range")
    $ip2 
= GetValueByKey("ZoneMap\Ranges\Range9"":Range")
    $activeX1 
= GetValueByKey("Zones\2""1001")
    $activeX2 
= GetValueByKey("Zones\2""1004")
    $activeX3 
= GetValueByKey("Zones\2""1200")
    $activeX4 
= GetValueByKey("Zones\2""1201")
    $activeX5 
= GetValueByKey("Zones\2""1405")
    $activeX6 
= GetValueByKey("Zones\2""2201")
    If $ip1 
= "XXXXXXXXXX" _
            And $ip2 
= "XXXXXXX" _
            And $activeX1 
= "0" _
            And $activeX2 
= "0" _
            And $activeX3 
= "0" _
            And $activeX4 
= "0" _
            And $activeX5 
= "0" _
            And $activeX6 
= "0" Then
        Return 
1
    Else
        Return 
0
    EndIf
EndFunc   ;
==>CheckRegistry
;主程序运行
Func Main()
    If IsAdmin() Then
        $title 
= "检测注册表";
        $text 
= "注册表导入失败,可能的原因有以下几种: " _
                 
& @LF & "1、您当前的用户权限不够  " _
                 
& @LF & "2、您电脑中的杀毒软件阻止了修改 " _
                 
& @LF & "3、您的注册表已锁定 " _
                 
& @LF & "请速与系统管理员联系!"
        EnableRegistry()
        If CheckRegistry() 
= 0 Then
            RegistryValue()
            If CheckRegistry() 
= 0 Then
                MsgBox(
16, $title, $text)
            EndIf
        Else
            MsgBox(
64, $title, "注册表导入成功!")
        EndIf
    Else
        MsgBox(
16, $title, "您当前的用户权限不够,导致注册表导入失败")
    EndIf
EndFunc   ;
==>Main
Main()

 另外我还用汇编调用win32的dll实现了一个,用的编辑器是masm32,代码如下

ContractedBlock.gif ExpandedBlockStart.gif Code
; #########################################################################

    .
386
    .model flat, stdcall
    option casemap :none

; #########################################################################

    include       \masm32\include\windows.
inc
    include       \masm32\include\kernel32.
inc
    includelib    \masm32\lib\kernel32.lib
    include       \masm32\include\user32.
inc
    includelib    \masm32\lib\user32.lib
    include       \masm32\include\advapi32.
inc
    includelib    \masm32\lib\advapi32.lib


; #########################################################################

    .data
    
    szRegKey      db 
"SOFTWARE\360safe\scan\",0
    szRegValueKey db 
"SScanDate",0
    
    .data?
    
    szRegValue    db 
4 dup (?)
    hKey          dd ?
    hValue        dd ?
    
    .code
    

start:
       invoke   RegOpenKeyEx,HKEY_LOCAL_MACHINE,offset szRegKey,NULL,\
                  KEY_QUERY_VALUE,addr hKey
               
         .if   eax == ERROR_SUCCESS
               invoke  RegQueryInfoKey,hKey,
0,0,0,0,0,0,0,0,addr hValue,0,0
               invoke  RegQueryValueEx,hKey,addr szRegValueKey,
0,0,addr szRegValue,addr hValue
               invoke MessageBox,NULL,ADDR szRegValue,ADDR szRegValueKey,MB_OK+MB_ICONINFORMATION  
        .endif
        invoke  RegCloseKey,hKey
        invoke  ExitProcess,NULL
end    start

 

转载于:https://www.cnblogs.com/wangyub522/archive/2009/04/23/1442256.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值