论文部分内容阅读
题目1:如何使用回答问题代替输入密码
对某一硬盘或文件夹采取加密,回答不同的问题拥有不同的权限(不能进入、只读、无法复制等),问题可以由管理员随时修改(论坛johnqs)。
要求:在Windows XP和Vista均可实现。
点评:也许这次不得不用软件了,难道是用VBS吗?等待高手来解决了。
论坛地址:http://bbs.cfan.com.cn/thread-729094-1-1.html
题目2:实现“关机中,请稍候”
关机总是那么匆忙,大家常用的Windows XP自不必多说,像新的Vista,点击“关机”按钮后,立刻就关机,突然想拷个文件,对不起了,您要重新开机。这种后悔的事还是要避免出现,最好在发出关机指令后可以有五秒钟的倒计时,这段时间内可以随时暂停关机进度,五秒后电脑自动关机。
要求:最好解决方案是能够替换系统原来的关机,(如在桌面按下Alt+F4),要同时解决Windows XP SP3和Vista SP1。
点评:以前有很多朋友用强行关闭进程的方法来实现这个功能,但这个方法并非全部有效,你能挑战成功吗?
2008年第09期“挑战之星”题目2是:用什么方法可以在进入系统(包括Windows 2000/XP/2003)或指定时间内检测特定账号的密码是否被修改?要求是一旦修改,要及时发回信息。
原本打算上网搜索这么一款符合要求的软件,然终未果。只好改用VBScript来尝试解决这个难题,皇天不负有心人,总算如愿以偿。
很早以前就曾听闻Windows系统用户账号的密码是以加密的形式藏匿于注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM]键项下。不过,要对该键项(值)进行读写操作首先必须获得权限。
第一步:获取读写权限。在Windows XP/2003中,点击“开始→运行”,输入:regedit(如果系统是Windows 2000,则输入:regedt32),依次展开[HKEY_LOCAL_MACHINE\SAM\SAM],在“SAM”右键上点击“权限”打开“SAM的权限”对话框,在“安全”栏中点击“添加”,出现“选择用户或组”,再依次点击“高级→立即查找”,将当前用户添加进来(见图1),“确定”后返回到“SAM的权限”窗口,勾选“zls的权限”下的“完全控制”及“读写” “允许”选项(见图2);
图1
这里添加的是用户“zls”
图2
第二步:确定账户名对应的账户值。按F5键刷新注册表后,展开“SAM”键下的“Domains”、“RXACT”等项,在[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names]下可以找到某一特定账户对应的十六进制账户值(见图3),以“Administrator”为例,其值为0x1f4(对于系统中的其他账号,亦可参照此法进行判断);
图3
第三步:新建C:\Windows\System32\1V.vbs。具体内容如下:
Const HKEY_LOCAL_MACHINE = &H80000002
sComputer= "."
sMethod= "GetBinaryValue"
hTree= HKEY_LOCAL_MACHINE
sKey= "SAM\SAM\Domains\Account\Users\000001F4"
sValue= "V"
Set oRegistry= GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
sComputer & "/root/default:StdRegProv")
Set oMethod= oRegistry.Methods_(sMethod)
Set oInParam= oMethod.inParameters.SpawnInstance_()
oInParam.hDefKey = hTree
oInParam.sSubKeyName = sKey
oInParam.sValueName = sValue
Set fso = CreateObject("Scripting.FileSystemObject")
Set VFile = fso.CreateTextFile("c:\1V.txt", True)
Set oOutParam = oRegistry.ExecMethod_(sMethod, oInParam)
For iCount = 0 To UBound(oOutParam.Properties_("uValue"))
VFile.WriteLine oOutParam.Properties_("uValue")(iCount)
Next
VFile.Close
运行该1V.vbs脚本,在C盘中将会生成一名为1V.txt的文本文件,将其重命名为2V.txt,然后再运行一次1V.vbs;
第四步:再新建C:\Windows\System32\Chk_PWD.vbs。具体内容如下:
Const HKEY_LOCAL_MACHINE = &H80000002
sComputer= "."
sMethod= "GetBinaryValue"
hTree= HKEY_LOCAL_MACHINE
sKey= "SAM\SAM\Domains\Account\Users\000001F4"
sValue= "V"
Set oRegistry= GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
sComputer & "/root/default:StdRegProv")
Set oMethod= oRegistry.Methods_(sMethod)
Set oInParam= oMethod.inParameters.SpawnInstance_()
oInParam.hDefKey = hTree
oInParam.sSubKeyName = sKey
oInParam.sValueName = sValue
Set fso = CreateObject("Scripting.FileSystemObject")
Set VFile = fso.CreateTextFile("c:\2V.txt", True)
Set oOutParam = oRegistry.ExecMethod_(sMethod, oInParam)
For iCount = 0 To UBound(oOutParam.Properties_("uValue"))
VFile.WriteLine oOutParam.Properties_("uValue")(iCount)
Next
VFile.Close
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFile1 = "C:\1v.txt"
strfile2 = "C:\2v.txt"
Set FileStream1 = objFSO.OpenTextFile(strFile1)
Set FileStream2 = objFSO.OpenTextFile(strfile2)
Do Until (FileStream1.AtEndOfStream) And (FileStream2.AtEndOfStream)
sLine1 = FileStream1.ReadLine()
sLine2 = FileStream2.ReadLine()
If sLine1 <> sLine2 Then
Wscript.Echo " Administrator账号密码已经被修改!"
exit Do
End If
Loop
第五步:只要修改了Administrator账户的密码,运行Chk_PWD.vbs后,就会弹出“Administrator账号密码已经被修改!”的提示窗口(见图4)。根据实际需求,将上述脚本加入到系统“启动”项目中或者设置为任务计划,具体步骤不再赘述。
图4
三点说明:
①注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下有“F”、“V”两个键值。其中V值与对应账户(Administrator)的密码息息相关,只要修改了该账号的密码就会导致V值产生变化,因此只要导出新V值,并与原先V值进行比较就能判断出该账号密码是否已经被修改;
②有许多人可能会有疑惑,如果使用“reg query”、“reg export”、“regdit /e”等命令直接导出[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下的V值进行比较呢,岂不是省事许多?之所以不这么做,是因为“reg query”等命令只能查询而无法导出注册表中的二进制值,“reg export”、“regdit /e”又都只能导出该键下的所有值,而该键下的“F”值又是变化着的数据,如果将“F”、“V”值全部导出再进行比较,不管是否修改了账户密码,比较结果肯定会存在差异;
③注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下的V值原为二进制值,用脚本导出之后,显示为分行的十进制值。
本文中的两段代码可以从http://work.newhua.com/cfan/200813/tzcx.rar下载到。
对某一硬盘或文件夹采取加密,回答不同的问题拥有不同的权限(不能进入、只读、无法复制等),问题可以由管理员随时修改(论坛johnqs)。
要求:在Windows XP和Vista均可实现。
点评:也许这次不得不用软件了,难道是用VBS吗?等待高手来解决了。
论坛地址:http://bbs.cfan.com.cn/thread-729094-1-1.html
题目2:实现“关机中,请稍候”
关机总是那么匆忙,大家常用的Windows XP自不必多说,像新的Vista,点击“关机”按钮后,立刻就关机,突然想拷个文件,对不起了,您要重新开机。这种后悔的事还是要避免出现,最好在发出关机指令后可以有五秒钟的倒计时,这段时间内可以随时暂停关机进度,五秒后电脑自动关机。
要求:最好解决方案是能够替换系统原来的关机,(如在桌面按下Alt+F4),要同时解决Windows XP SP3和Vista SP1。
点评:以前有很多朋友用强行关闭进程的方法来实现这个功能,但这个方法并非全部有效,你能挑战成功吗?
2008年第09期“挑战之星”题目2是:用什么方法可以在进入系统(包括Windows 2000/XP/2003)或指定时间内检测特定账号的密码是否被修改?要求是一旦修改,要及时发回信息。
原本打算上网搜索这么一款符合要求的软件,然终未果。只好改用VBScript来尝试解决这个难题,皇天不负有心人,总算如愿以偿。
很早以前就曾听闻Windows系统用户账号的密码是以加密的形式藏匿于注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM]键项下。不过,要对该键项(值)进行读写操作首先必须获得权限。
第一步:获取读写权限。在Windows XP/2003中,点击“开始→运行”,输入:regedit(如果系统是Windows 2000,则输入:regedt32),依次展开[HKEY_LOCAL_MACHINE\SAM\SAM],在“SAM”右键上点击“权限”打开“SAM的权限”对话框,在“安全”栏中点击“添加”,出现“选择用户或组”,再依次点击“高级→立即查找”,将当前用户添加进来(见图1),“确定”后返回到“SAM的权限”窗口,勾选“zls的权限”下的“完全控制”及“读写” “允许”选项(见图2);
图1
这里添加的是用户“zls”
图2
第二步:确定账户名对应的账户值。按F5键刷新注册表后,展开“SAM”键下的“Domains”、“RXACT”等项,在[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names]下可以找到某一特定账户对应的十六进制账户值(见图3),以“Administrator”为例,其值为0x1f4(对于系统中的其他账号,亦可参照此法进行判断);
图3
第三步:新建C:\Windows\System32\1V.vbs。具体内容如下:
Const HKEY_LOCAL_MACHINE = &H80000002
sComputer= "."
sMethod= "GetBinaryValue"
hTree= HKEY_LOCAL_MACHINE
sKey= "SAM\SAM\Domains\Account\Users\000001F4"
sValue= "V"
Set oRegistry= GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
sComputer & "/root/default:StdRegProv")
Set oMethod= oRegistry.Methods_(sMethod)
Set oInParam= oMethod.inParameters.SpawnInstance_()
oInParam.hDefKey = hTree
oInParam.sSubKeyName = sKey
oInParam.sValueName = sValue
Set fso = CreateObject("Scripting.FileSystemObject")
Set VFile = fso.CreateTextFile("c:\1V.txt", True)
Set oOutParam = oRegistry.ExecMethod_(sMethod, oInParam)
For iCount = 0 To UBound(oOutParam.Properties_("uValue"))
VFile.WriteLine oOutParam.Properties_("uValue")(iCount)
Next
VFile.Close
运行该1V.vbs脚本,在C盘中将会生成一名为1V.txt的文本文件,将其重命名为2V.txt,然后再运行一次1V.vbs;
第四步:再新建C:\Windows\System32\Chk_PWD.vbs。具体内容如下:
Const HKEY_LOCAL_MACHINE = &H80000002
sComputer= "."
sMethod= "GetBinaryValue"
hTree= HKEY_LOCAL_MACHINE
sKey= "SAM\SAM\Domains\Account\Users\000001F4"
sValue= "V"
Set oRegistry= GetObject("winmgmts:{impersonationLevel=impersonate}//" & _
sComputer & "/root/default:StdRegProv")
Set oMethod= oRegistry.Methods_(sMethod)
Set oInParam= oMethod.inParameters.SpawnInstance_()
oInParam.hDefKey = hTree
oInParam.sSubKeyName = sKey
oInParam.sValueName = sValue
Set fso = CreateObject("Scripting.FileSystemObject")
Set VFile = fso.CreateTextFile("c:\2V.txt", True)
Set oOutParam = oRegistry.ExecMethod_(sMethod, oInParam)
For iCount = 0 To UBound(oOutParam.Properties_("uValue"))
VFile.WriteLine oOutParam.Properties_("uValue")(iCount)
Next
VFile.Close
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFile1 = "C:\1v.txt"
strfile2 = "C:\2v.txt"
Set FileStream1 = objFSO.OpenTextFile(strFile1)
Set FileStream2 = objFSO.OpenTextFile(strfile2)
Do Until (FileStream1.AtEndOfStream) And (FileStream2.AtEndOfStream)
sLine1 = FileStream1.ReadLine()
sLine2 = FileStream2.ReadLine()
If sLine1 <> sLine2 Then
Wscript.Echo " Administrator账号密码已经被修改!"
exit Do
End If
Loop
第五步:只要修改了Administrator账户的密码,运行Chk_PWD.vbs后,就会弹出“Administrator账号密码已经被修改!”的提示窗口(见图4)。根据实际需求,将上述脚本加入到系统“启动”项目中或者设置为任务计划,具体步骤不再赘述。
图4
三点说明:
①注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下有“F”、“V”两个键值。其中V值与对应账户(Administrator)的密码息息相关,只要修改了该账号的密码就会导致V值产生变化,因此只要导出新V值,并与原先V值进行比较就能判断出该账号密码是否已经被修改;
②有许多人可能会有疑惑,如果使用“reg query”、“reg export”、“regdit /e”等命令直接导出[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下的V值进行比较呢,岂不是省事许多?之所以不这么做,是因为“reg query”等命令只能查询而无法导出注册表中的二进制值,“reg export”、“regdit /e”又都只能导出该键下的所有值,而该键下的“F”值又是变化着的数据,如果将“F”、“V”值全部导出再进行比较,不管是否修改了账户密码,比较结果肯定会存在差异;
③注册表中的[HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F4]键下的V值原为二进制值,用脚本导出之后,显示为分行的十进制值。
本文中的两段代码可以从http://work.newhua.com/cfan/200813/tzcx.rar下载到。