防止批处理文件被编辑

Keep batch file from being edited

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

这可能吗?如何实现?

我搜索过,但找不到。我找到了所有关于如何锁定 PC 或其他东西但不是我的批处理 file/script 并且 Q 不是如何隐藏我的脚本或其他东西但是如果你想编辑它,它会给出错误或者如果你点击编辑它不起作用。

简答:否

长答案:不,不可能

你可以混淆它,但你不能隐藏来源。
cmd.exe 必须以某种方式执行您的批处理,因此它必须看到命令,但是当 cmd.exe 可以看到您的命令时,其他人也可以看到它们。

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

但这只会阻止 changes 绝对菜鸟。

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

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

One.bat

@echo off
two

Two.bat

@echo off
echo this is 2
pause

two.bat 的属性设置为 -h(也许 -r)。
然后调用one.bat。刚刚在 Win7 下测试了这个,令我惊讶的是它有效。

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

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

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

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

关于这个话题多说几句。

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

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

@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 中测试了这个方法。

我试着批量制作这个。我想这个文件可能有点帮助,它使用加密密码方法。您可以将批处理文件包装到一个加密的 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.

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

@echo off
attrib +R