Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 禁止编辑批处理文件_Batch File_Passwords_Locking - Fatal编程技术网

Batch file 禁止编辑批处理文件

Batch file 禁止编辑批处理文件,batch-file,passwords,locking,Batch File,Passwords,Locking,我可以为批处理文件/脚本锁定或设置密码吗?我已经制作了一个脚本,但我不想让我的工作人员更改它。他们必须能够运行它,但不能编辑它 这可能吗?如何实现 我已经找过了,但找不到。我找到了所有关于如何锁定PC或其他东西的信息,但不是我的批处理文件/脚本,问题不是如何隐藏我的脚本或其他东西,但如果你不想编辑它,它会给出一个错误,或者如果你单击“编辑”,它将不起作用。简短回答:否 回答很长:不,不可能 您可以混淆它,但无法隐藏其来源。 不知何故,cmd.exe必须执行批处理,因此它必须查看命令,但当cmd.

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

这可能吗?如何实现

我已经找过了,但找不到。我找到了所有关于如何锁定PC或其他东西的信息,但不是我的批处理文件/脚本,问题不是如何隐藏我的脚本或其他东西,但如果你不想编辑它,它会给出一个错误,或者如果你单击“编辑”,它将不起作用。

简短回答:否

回答很长:不,不可能

您可以混淆它,但无法隐藏其来源。
不知何故,cmd.exe必须执行批处理,因此它必须查看命令,但当cmd.exe可以看到您的命令时,用户也可以看到它们

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

但这只会阻止来自绝对的noobs的变化

简短的回答:没有

回答很长:不,不可能

您可以混淆它,但无法隐藏其来源。
不知何故,cmd.exe必须执行批处理,因此它必须查看命令,但当cmd.exe可以看到您的命令时,用户也可以看到它们

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


但这只会阻止来自绝对的noobs的变化

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

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

如果您的用户不太成熟,您可以隐藏批处理文件并从另一个批处理文件调用它:

一只蝙蝠

@echo off
two
2.bat

@echo off
echo this is 2
pause
two.bat
的属性设置为
-h
(可能还有
-r
)。
然后调用
one.bat
。刚刚在Win7下测试了这个,让我惊讶的是它居然能工作


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

如果您的用户不太成熟,您可以隐藏批处理文件并从另一个批处理文件调用它:

一只蝙蝠

@echo off
two
2.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

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

此命令将删除继承的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();

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

关于此主题,请再说一句

不可能避免其他人访问您的批处理文件;但是,如果您希望避免其他人可以查看批处理文件内容(因此他们无法修改批处理文件的任何部分),则有几种方法可以做到这一点,包括将文件转换为.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();

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

我尝试批量制作此方法。我想这个文件可能会有所帮助,它使用了加密的密码方法。你可以将批处理文件包装成加密的exe文件,如果你想让代码变得模糊,甚至可能添加一个字节顺序标记,让其他人更难获得你的密码,只要问一下,我会帮你做的。也可以通过执行此操作自动设置文件;创建“PasswordOptions.bat”文件后,转到该文件,设置密码,取消隐藏密码文件,打开密码文件夹,复制并粘贴“Pswrd.Zask”和“Key.Zask”fi