这个问题正在吞噬我的大脑。我有一个简单的批处理文件,只有在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
任何建议?
答案 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
。阅读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位命令行提示符下运行attrib
或dir
,那么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转换器......