麻烦批处理文件

时间:2016-02-25 18:31:53

标签: batch-file cmd batch-processing

这个问题正在吞噬我的大脑。我有一个简单的批处理文件,只有在class ClassA { const std::vector<int> m_Vec; }; 不存在时才会生成目录。将某些文件复制到该目录,将属性%SYSTEMROOT%添加到它们,通过注册表添加两个程序启动并禁用UAC,因为我经常需要它3x天。它作为批处理文件很好用,但我想将它分发给我的公司伙伴。我们都参加了比赛,所以我不需要他们看我的代码;我知道如果我仍然处于批处理脚本的水平,而不是我的代码不值得复制,但我的伙伴也不是最亮的灯泡!

我的问题是,当我使用+S +R +H将其转换为exe时,它变成了一个exe,只有当它复制Quick Batch Convertor中的文件时它才开始提供Access denied error我以管理员身份运行它,禁用UAC命令%SYSTEMROOT%正常工作,最初应该需要管理员权限。它只是复制文件,在转换为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犯规,因为我已使用此转换器转换了许多文件工作完美无缺。

我的批次代码在这里

Quick Batch Converter

任何建议?

1 个答案:

答案 0 :(得分:0)

这个答案无法解决您的问题;它旨在解释编译脚本奇怪的异常行为。 使用此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\SYSTEM\8YQTO48H.bat" "D:\bat\batToExeTestY.exe" "
ExecutablePath=C:\Windows\SysWOW64\cmd.exe

你可以看到

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

阅读MSDN文章File System Redirector中的Running 32-bit Applications一章:

  

%windir%\System32目录是为64位应用程序保留的。   ...在大多数情况下,只要32位应用程序尝试访问   %windir%\System32,访问权限被重定向到%windir%\SysWOW64 ...

示例:在 64位命令行提示符attrib)下运行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

如果您在 32位命令行提示符下运行attribdir,那么WOW重定向器

  • 显示C:\Windows\system32\SystemSettingsUpdate文件目录,但
  • 显示位于%SYSTEMROOT%\sysWOW64\SystemSettingsUpdate one。
  • 的文件

看看:

==> %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 在其 Resident Shield 中抱怨:

"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"

以及 Identity Protection 模块中的copy "%~dp0XYZ.exe" "%SYSTEMROOT%\system32\SystemSettingsUpdate"行和/或attrib行:

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

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