作者:mobiledu2502911415 | 来源:互联网 | 2023-02-12 19:33
当我试图获得我的批处理脚本的提升权限时,我发现了两个相关的SO问题
如何在批处理文件中请求管理员访问权限
如何自动提升我的批处理文件,以便在需要时从UAC管理员权限请求?
......这导致了部分解决的问题.出于某种原因,我遇到了在VBS脚本中包含空格的文件路径参数的命令行传递问题,所以我试图将解决方案分成3部分并集中在内部(VBS)步骤,然后通过调用a添加最后一步尽管与VBS脚本位于同一文件夹中,但无法找到该VBS中的批处理.我发现,拖放不是"那么简单" 和它使用时的不同.vbs
,而不是.bat
或.exe
用作放置目标.
这是我的实际问题:
如果我拖动文件并将其拖放到可执行文件(exe)或批处理文件(bat,cmd)上,则当前工作目录由拖动项目的来源确定.其目录设置为处理它的程序或脚本的工作目录.
如果我将文件放到VBS脚本上,则会有所不同.在Windows 8.1 x64上,C:\Windows\System32
即使参数与VBS位于同一文件夹中,我也会观察到它.
我可以简单地使用这样的批处理文件(如拖放中继)
my.vbs %*
获得"正常" .bat
行为(drop source指示CWD),但我也想了解它.
这是一个错误还是一个功能?它是否与所有Windows版本一致?
编辑:为显示我如何到达的问题添加背景(在顶部)(+次要更正)
1> MC ND..:
经过一些API监控,这就是我所看到的
将文件放在.exe
文件上时,explorer.exe
使用CreateProcess
API函数启动进程,将可执行文件作为lpApplicationName
,将可执行文件和删除文件作为lpCommandLine
.的lpCurrentDirectory
是在函数调用由呼叫者过程设置为包含拖放的文件的文件夹[1] .
当您将文件放在.cmd
文件上时,它explorer.exe
也使用CreateProcess
API,但在这种情况下,lpApplicationName
is null
和lplCommandLine
包含批处理文件和删除的文件.lpCurrentDirectory
也设置为删除文件[1]的父文件夹.
当您将文件放在.vbs
文件上时,ShellExecuteEx
使用lpDirectory
该SHELLEXECUTEINFO
结构的字段null
,因此,创建的进程将继承父进程的当前活动目录.默认情况下,explorer.exe
进程的当前活动目录是%systemroot%\system32
,但是可以explorer
使用将在此类删除操作中继承的不同当前活动目录启动实例.
[1]如果我们删除多个文件,则使用作为第一个参数传递的文件的路径
请注意仅供参考:测试活动目录继承后面的过程是:
打开cmd
实例并将当前活动目录更改为c:\temp
杀死所有explorer.exe
实例
从cmd
实例调用explorer.exe
.此explorer
实例将cmd
窗口中的活动目录作为其当前活动目录.