1

Windows は個々のフォルダーにパスワード保護を提供しないため、「フォルダー ロック」のような多くのサード パーティ製ソフトウェアがその役割を果たします。この種のアプリケーションの背後にあるロジックを知りたいと思っていたところ、'lock-a-folder' のようなコードを見つけました。これは、私がよく知らない AutoIt スクリプトです。ただし、ここで使用されるロジックを知りたいだけです。

これらは、私が興味を持っているスクリプトの主な機能です:

Func Lock($slected)
  Local $Temp,$TempFile
  If @error or $slected = "" Then Return("Empty selection/Cancel Pressed")
  If Not FileExists($slected) Then
    MsgBox(0, $AppName, $slected & " " & Lang('doesntexist'), 0, $WIN1)
    Return('doesntexist')
  EndIf
  Local $l0ckd = RegRead("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders")
  _DebugOut('RegRead("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders") = ' & $l0ckd)

  If Not StringInStr($l0ckd, $slected & ".{90F8C996-7C70-4331-9D70-FB357D559FD5}|") = 0 Then
    MsgBox(0, $AppName, $slected & " " & Lang('alreadyinlist'), 0, $WIN1)
    Return('alreadyinlist')
  EndIf
  If $CmdLine[0] = 0 Then
    GUICtrlSetData($List1, "")
    GUICtrlSetData($List1, Lang('plzwait') & "....")
    GUISetState(@SW_DISABLE)
  EndIf
  _DebugOut($slected)
  If $CmdLine[0] = 0 Then GUISetState(@SW_ENABLE)
  If DirMove($slected, $slected & ".{90F8C996-7C70-4331-9D70-FB357D559FD5}") = 0 Then
  FileSetAttrib($slected, "-RSH")
  MsgBox(0, $AppName, $slected & " " & Lang('unable2lock'), 0, $WIN1)
  If $CmdLine[0] = 0 Then Readfolders()
    Return('unable2lock')
  EndIf
  $slected = $slected & ".{90F8C996-7C70-4331-9D70-FB357D559FD5}"
  FileSetAttrib($slected, "+RSH")
  $l0ckd &= $slected & "|"
  _DebugOut("$l0ckd &= $slected| = " & $l0ckd)
  $debug = RegWrite("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders", "REG_SZ", $l0ckd)
  _DebugOut('RegWrite("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders", "REG_SZ", $l0ckd) = ' & $debug)
  If $CmdLine[0] = 0 Then Readfolders()
  Return("Done")
EndFunc ;==>Lock


Func UnLock($slected)
  _DebugOut($slected)
  If $slected = "" Or @error Then
    MsgBox(0, $AppName, Lang('selectfirst'), 0, $WIN1)
    Return("Empty selection/Cancel Pressed")
  EndIf
  If $CmdLine[0] = 0 Then
    GUICtrlSetData($List1, "")
    GUICtrlSetData($List1, Lang('plzwait') & "....")
    GUISetState(@SW_DISABLE)
  EndIf
  Local $Temp = StringReplace($slected, ".{90F8C996-7C70-4331-9D70-FB357D559FD5}", "", 0, 2)
  _DebugOut("$Temp = " & $Temp)
  FileSetAttrib($slected, "-RSH")
  Local $Temp1
  $Temp1 = DirMove($slected, $Temp)
  If $CmdLine[0] = 0 Then GUISetState(@SW_ENABLE)
  If $Temp1 = 0 Then
    $Temp1 = DirMove($slected, $Temp & ".recovered")
  EndIf
  If $Temp1 = 0 Then

  MsgBox(0, $AppName, $slected & " " & Lang('unable2unlock'), 0, $WIN1)
  If $CmdLine[0] = 0 Then Readfolders()
    Return('unable2unlock')
  EndIf
  Local $l0ckd = RegRead("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders")
  _DebugOut('RegRead("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders") = ' & $l0ckd)
  $Temp = StringReplace($l0ckd, $slected & "|", "")
  _DebugOut('StringReplace($l0ckd, $slected & "|", "")' & " = " & $Temp)
  $debug = RegWrite("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders", "REG_SZ", $Temp)
  _DebugOut('RegWrite("HKEY_CURRENT_USER\SOFTWARE\" & $AppName, "lockedfolders", "REG_SZ", $l0ckd) = ' & $debug)
  If $CmdLine[0] = 0 Then Readfolders()
  Return("Done")
EndFunc ;==>UnLock

誰かロジックを教えてください。

4

2 に答える 2

2

スクリプトは、次のようなレジストリ エントリを作成します。

HKCR\CLSID\{90F8C996-7C70-4331-9D70-FB357D559FD5}
HKCR\CLSID\{90F8C996-7C70-4331-9D70-FB357D559FD5}\shell\open
HKCR\CLSID\{90F8C996-7C70-4331-9D70-FB357D559FD5}\shell\explore
HKCR\CLSID\{90F8C996-7C70-4331-9D70-FB357D559FD5}\shell\opennewwindow
HKCR\CLSID\{90F8C996-7C70-4331-9D70-FB357D559FD5}\shell\opennewprocess

HKCU\SOFTWARE\$AppName\lockedfolders

フォルダをロックすると、名前が次のように変更されFolderName.{90F8C996-7C70-4331-9D70-FB357D559FD5}、この名前が後で参照できるように の値に追加されHKCU\SOFTWARE\$AppName\lockedfoldersます。

ロックを解除すると、フォルダーが元の名前に戻り、レジストリ値からエントリが削除されます。

したがって、まったく安全ではないようです。

于 2013-01-31T09:19:32.377 に答える