【问题标题】:Keep batch file from being edited防止批处理文件被编辑
【发布时间】:2015-02-26 13:24:50
【问题描述】:

我可以锁定或设置批处理文件/脚本的密码吗?我已经制作了一个脚本,但我不希望我的工作人员更改它。他们必须能够运行它但不能编辑它。

这可能吗?如何实现?

我已经搜索了它,但我找不到它。我找到了所有关于如何锁定 PC 或其他东西的信息,但不是我的批处理文件/脚本,Q 不是如何隐藏我的脚本或其他东西,但如果你想编辑它,它会给出错误,或者如果你点击编辑它不要不行。

【问题讨论】:

  • 您对他们查看文件内容没有意见,对吧?只是你不想让任何人编辑它。
  • 他们可以看到它,但我不希望他们改变它
  • 您可能会发现this post 很有趣。它还不够复杂,无法防止有人决心进行逆向工程,但至少可以阻止大多数用户弄乱源代码。

标签: batch-file passwords locking


【解决方案1】:

如果您不希望他们能够提交对文件的更改,只需设置文件权限,只允许您(或某些管理员组)修改文件。

此命令将删除继承的 ACL 条目,授予您完全权限,并授予其他所有人读取权限:

icacls your_file.cmd /inheritance:r /grant youruserid:F /grant everyone:RX

【讨论】:

  • 这绝对不是完美的,但最接近保护文件不被编辑的方法
【解决方案2】:

这是不可能的,但是你可以使用这个技巧制作一个简单地从 system() 函数调用这些 cmds 的 c/c++ 程序。在这种情况下,您的命令将在一定程度上被隐藏,他们将无法更改它。

【讨论】:

    【解决方案3】:

    关于这个话题再多说一句话。

    无法避免其他人有权访问您的批处理文件;但是,如果您想避免其他人可以查看批处理文件内容(因此他们不能修改其中的任何部分),那么有几种方法可以做到这一点,包括将文件转换为 .exe 格式,尽管这些方法中没有一种可以完全保护确定的用户。

    这里的重点是使用对您来说足够简单的方法,因此您可以毫无问题地实施它,但对其他人来说足够复杂,因此它会阻止您的用户尝试破坏它。我提出了一个基于 JScript 源程序的 Encode 过程的解决方案,这种方法不是广为人知的方法,因此它甚至可以针对没有适当信息的高级用户提供保护。这里是:

    @if (@CodeSection == @Batch) @then
    
    
    @echo off
    setlocal DisableDelayedExpansion
    
    REM Obfuscate.bat: Obfuscate Batch files
    REM Antonio Perez Ayala
    
    if "%~1" equ "" echo Usage: Obfuscate filename.bat & goto :EOF
    if not exist "%~1" echo File not found: "%~1" & goto :EOF
    
    set "at=@"
    set "pass=%random%"
    (
       echo %at%if (@Pass == @X%pass%^) @begin
       echo    @echo off
       echo    CScript //nologo //E:JScript.Encode "%%~F0" ^> %pass%.bat
       echo    call %pass%
       echo    del %pass%.bat
       echo    exit /B
       echo %at%end 
       echo //**Start Encode**
       echo var a = new Array(^);
    
       set "i=0"
       for /F "usebackq delims=" %%a in ("%~1") do (
          set /A i+=1
          set "line=%%a"
          setlocal EnableDelayedExpansion
          echo a[!i!] = '!line:'=\x27!';
          endlocal
       )
    
       setlocal EnableDelayedExpansion
       echo for ( var i=1; i^<=!i!; ++i ^) WScript.Stdout.WriteLine(a[i]^);
    ) > "%~N1.tmp"
    
    CScript //nologo //E:JScript "%~F0" "%~N1.tmp"
    del "%~N1.tmp"
    goto :EOF
    
    
    @end
    
    
    // Encode a JScript source file
    // Antonio Perez Ayala
    
    var fileToEncode = WScript.Arguments(0);
    
    // Read the source file
    
    var oFSO = WScript.CreateObject("Scripting.FileSystemObject");
    var oFile = oFSO.GetFile(fileToEncode);
    var oStream = oFile.OpenAsTextStream(1);
    var sSourceFile = oStream.ReadAll();
    oStream.Close();
    
    // Encode the file
    
    var oEncoder = WScript.CreateObject("Scripting.Encoder");
    var sDest = oEncoder.EncodeScriptFile(".js",sSourceFile,0,"")
    
    // Write the encoded version
    
    var sFileOut = fileToEncode.slice(0,-3)+"obf.bat";
    var oEncFile = oFSO.CreateTextFile(sFileOut);
    oEncFile.Write(sDest);
    oEncFile.Close();
    

    将此程序复制为 Obfuscate.bat 并使用它在参数中提供您的批处理文件;之后,将创建一个扩展名为 .obf.bat 的新文件,该文件的工作方式与原始文件相同,但其内容以不可读的方式编码。例如:

    C:\> type test.bat
    @echo off
    
    echo Hello World
    
    C:\> Obfuscate test.bat
    
    C:\> type test.obf.bat
    @if (@Pass == @X20203) @begin
       @echo off
       CScript //nologo //E:JScript.Encode "%~F0" > 20203.bat
       call 20203
       del 20203.bat
       exit /B
    @end
    //**Start Encode**#@~^kQAAAA==@#@&\CMPmP',x⌂APzD.lH`bI@#@&l]qT,'PE@$nm4W,WW0vI@#
    @&C$yDP{Pvn1tW~u⌂VsW,   KDs9Bp@#@&6WM~`,\CD,kxqpPk@!x pP_3r~#,⌂Um.k2Oc?ONK;Yc⌂.r
    D+SrU⌂`C$bD*i@#@&kiYAAA==^#~@
    C:\> test.obf.bat
    Hello World
    

    我在 Windows XP 和 Windows 8 中测试了这种方法。

    【讨论】:

      【解决方案4】:

      简短回答:没有

      长答案:不,不可能

      你可以混淆它,但你不能隐藏来源。
      不知何故 cmd.exe 必须执行你的批处理,所以它必须看到命令,但是当 cmd.exe 可以看到你的命令时,那么一个人也可以看到它们。

      由于您只想锁定文件进行编辑,您可以使用上述两种方式:
      然后使用attrib 可以通过添加只读或隐藏属性来解决它(如提到的@JanDoggen)。
      或者通过更改安全设置(如提到的@mstth)更安全的方式

      但这只会阻止绝对菜鸟的更改。

      【讨论】:

      • 问题不是不允许其他人看到内容,而是OP不希望他们更改它。
      • @JanDoggen 然后你可以简单地复制内容。那你想怎么保护呢?
      • 他们很懒,我认为他们不会制作新的,但他们会在脚本中更改并删除我的名字
      【解决方案5】:

      我尝试批量制作。我想这个文件可能会有所帮助,它使用加密的密码方法。您可以将批处理文件包装成一个加密的 exe 文件,如果您想要混淆代码,甚至可能添加一个字节顺序标记,以使其他人更难获取您的密码,只需询问,我会为您完成。您也可以通过这样做自动设置文件;创建后转到“PasswordOptions.bat”文件,设置密码,取消隐藏密码文件,然后打开密码文件夹,将“Pswrd.Zask”和“Key.Zask”文件复制并粘贴到不同的文件夹中,然后使用内容以备后用,最后重置您的密码。

      @echo off
      title Zask's password encrypted batch file
      color 0a
      
      echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
      echo º Zask's password encrypted batch file º
      echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
      echo.
      
      if not exist "C:\Pswrd.Zask\" (
        mkdir "C:\Pswrd.Zask\"
          if "!errorlevel!" EQU "0" (
            goto DirectoryExist
          ) else (
         echo Created the folder "C:\Pswrd.Zask" & timeout /t 5 /nobreak
        )
      ) else (
            goto DirectoryExist
      )
      
      :DirectoryExist
      
      if exist C:\Pswrd.Zask\Key.Zask (
          goto UsernameExist
      ) else (
          goto CreatePasswordScreen
      )
      
      
      :UsernameExist
      
       for /f "Delims=" %%A in (C:\Pswrd.Zask\Password.Zask) do (
            set CHECKPASSWORD=%%A
      )
          for /f "Delims=" %%B in (C:\Pswrd.Zask\Key.Zask) do (
            set CHECKKEY=%%B
      )
      
      goto PasswordScreen
      
      :CreatePasswordScreen
      cls
      echo Create a password.
      echo.
      
      setlocal EnableDelayedExpansion
      
      set /p "CREATEPASSWORD= Enter password : "
      set /p "CREATEKEY= Enter a key number (Choose a number 2-200) : "
      
      set CHAR=0123456789bhfcjrwmudaxopvntzlqeisykg
      
      
      for /l %%C in (10 1 36) do (
      
      for /f %%D in ("!CHAR:~%%C,1!") do (
      
      set /a MATH=%%C*%CREATEKEY%
      for /f %%E in ("!MATH!") do (
      
      set "CREATEPASSWORD=!CREATEPASSWORD:%%D=-%%E!"
      
      )
      )
      )
      
      echo %CREATEPASSWORD% >> C:\Pswrd.Zask\Password.Zask
      attrib C:\Pswrd.Zask\Password.Zask +s +h & echo. & echo Password Created!
      
      echo %CREATEKEY% >> C:\Pswrd.Zask\Key.Zask
      attrib C:\Pswrd.Zask\Key.Zask +s +h & echo Username Created!
      echo.
      
      if exist "%~dp0ResetPassword.bat" (
      del "%~dp0ResetPassword.bat" )
      
      :ResetPassword
      set /p "RESETOPTION=Would you like to create the password options file in the current directory (Y/N)? : "
      if /i %RESETOPTION%==Y goto ResetOptions
      if /i %RESETOPTION%==N goto SkipResetOptions
      
      :ResetOptions
      echo @echo off >> PasswordOptions.bat
      echo title ResetPassword.bat >> PasswordOptions.bat
      echo color 0a >> PasswordOptions.bat
      echo :start >> PasswordOptions.bat
      echo. >> PasswordOptions.bat
      echo echo ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» >> PasswordOptions.bat
      echo echo º This file is used to reset your password, hide it for future purposes or delete it º >> PasswordOptions.bat 
      echo echo º      to avoid other users from removing your password. You have 5 options          º >> PasswordOptions.bat
      echo echo ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ >> PasswordOptions.bat
      echo echo. >> PasswordOptions.bat
      echo echo 1 - Reset password. >> PasswordOptions.bat
      echo echo 2 - Open password folder. >> PasswordOptions.bat
      echo echo 3 - Unhide files in the password folder. >> PasswordOptions.bat
      echo echo 4 - Hide files in the password folder. >> PasswordOptions.bat
      echo echo 5 - Exit dialog. >> PasswordOptions.bat
      echo echo. >> PasswordOptions.bat
      echo set /p "OPTIONS=Chose a number to select that option : " >> PasswordOptions.bat
      echo if %%OPTIONS%%==1 goto PasswordReset >> PasswordOptions.bat
      echo if %%OPTIONS%%==2 start C:\Pswrd.Zask ^& cls ^& goto start >> PasswordOptions.bat
      echo if %%OPTIONS%%==3 attrib C:\Pswrd.Zask\Password.Zask -s -h ^& attrib C:\Pswrd.Zask\Key.Zask -s -h ^& cls ^& goto start >> PasswordOptions.bat
      echo if %%OPTIONS%%==4 attrib C:\Pswrd.Zask\Password.Zask +s +h ^& attrib C:\Pswrd.Zask\Key.Zask +s +h ^& cls ^& goto start >> PasswordOptions.bat
      echo if %%OPTIONS%%==5 exit >> PasswordOptions.bat
      echo. >> PasswordOptions.bat
      echo :PasswordReset >> PasswordOptions.bat
      echo cls >> PasswordOptions.bat
      echo set /p "RESET=Are you sure you want to reset your password (Y/N)? : " >> PasswordOptions.bat
      echo if /i %%RESET%%==Y goto ResetPassword >> PasswordOptions.bat
      echo if /i %%RESET%%==N goto start >> PasswordOptions.bat
      echo cls >> PasswordOptions.bat
      echo. >> PasswordOptions.bat
      echo :ResetPassword >> PasswordOptions.bat
      echo rd /s /q "C:\Pswrd.Zask" >> PasswordOptions.bat
      echo echo Password was deleted! >> PasswordOptions.bat
      echo pause >> PasswordOptions.bat
      echo del %%~n0%%~x0 >> PasswordOptions.bat
      echo exit >> PasswordOptions.bat
      cls
      
      echo. & echo Created file "%~dp0ResetPassword.bat" & timeout /t 5 /nobreak
      
      :SkipResetOptions
      
      start %~n0%~x0
      exit
      
      :PasswordScreen
      color 0a
      cls
      echo Existing User Account.
      echo.
      
      setlocal EnableDelayedExpansion
      
      set /p "PASSWORD= Enter Password : "
      set /p "KEY= Enter the original encryption key : "
      
      set CHAR=0123456789bhfcjrwmudaxopvntzlqeisykg
      
      for /l %%C in (10 1 36) do (
      
      for /f %%D in ("!CHAR:~%%C,1!") do (
      
      set /a MATH=%%C*%CHECKKEY%
      for /f %%E in ("!MATH!") do (
      
      set "CHECKPASSWORD=!CHECKPASSWORD:%%E=%%D!"
      
      )
      )
      )
      
      for /f %%F in ("!CHECKPASSWORD!") do (
      set "CHECKPASSWORD=!CHECKPASSWORD:-=!"
      
      )
      
      
      if %PASSWORD%==%CHECKPASSWORD% (
      goto Operation1True
      ) else (
      goto OperationFalse
      )
      
      :Operation1True
      if %KEY%==%CHECKKEY% (
      goto Operation2True
      ) else (
      goto OperationFalse
      )
      
      :OperationFalse
      color 0c
      echo Password Incorrect!
      timeout /t 10 /nobreak
      goto PasswordScreen
      
      :Operation2True
      cls
      echo Password Correct!
      echo.
      pause
      
      REM YOUR CODE GOES HERE.
      REM YOU CAN CONVERT THIS IS INTO A EXE FILE IF WANTED.
      REM FREE TO MODIFY ANY CONTENT IN THIS FILE FOR BUSINESS OR PERSONAL REASONS.
      

      【讨论】:

        【解决方案6】:

        你可以像这样在文件的开头设置一个属性:

        @echo off
        attrib +R
        

        【讨论】:

        • 这是否会阻止某人读取和编辑文件内容,或者只是在控制台运行时打印到控制台?
        【解决方案7】:

        如果您的用户不是很老练,也许您可​​以隐藏您的批处理文件并从另一个人调用它:

        一个.bat

        @echo off
        two
        

        两个.bat

        @echo off
        echo this is 2
        pause
        

        将two.bat 的属性设置为-h(也可能是-r)。
        然后拨打one.bat。刚刚在 Win7 下测试过,令我惊讶的是它可以工作。

        但是,如果您工作的人知道如何更改文件属性,这并不能解决您的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-10
          • 2013-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-04-24
          • 2011-11-17
          • 2011-09-28
          相关资源
          最近更新 更多