3

我正在尝试使用远程框架安装驱动程序,该框架允许我运行作为远程计算机上远程处理/监控应用程序的子级生成的 shell 命令,以 cmd /c“命令”运行。但是由于安全功能认为驱动程序可能不安全,驱动程序拒绝安装。

驱动程序也有引号(路径中的空格)所以它就像

Dim command: command =  "\\\\server\\driver\\folder\\Autorun.exe" /passive   /norestart";
Set retVal = remote.Shell(command)

运行

cmd /c " "\\server\driver\folder\Autorun.exe" /passive /norestart"

在远程机器上

我已经尝试过并且在之前的语句中使用 setx SEE_MASK_NOZONECHECKS 1 /m 时遇到了麻烦,我猜测子进程看不到新的全局环境变量,这些变量在它的父进程启动时并不存在,并且没有它就无法工作重新启动。我想避免重新启动。

我试着跑步

cmd /c " set SEE_MASK_NOZONECHECKS=1 & "\\server\driver\folder\Autorun.exe" /passive /norestart" 

但它似乎不起作用。有任何想法吗?

4

4 回答 4

3

您在使用 SEE_MASK_NOZONECHECKS 的方式上有点迷失了。它不是环境变量,不能从命令提示符修改,它是ShellExecuteEx()的一个选项。您确实用于启动程序的 winapi 函数。目前还不清楚您可以访问哪些编程工具,在批处理文件或 VBScript 中使用它是行不通的。例如,您至少需要 VB.NET 并调用该函数。您可以从 pinvoke.net 网站获取所需的声明。

让我们谈谈真正发生的事情,您可能会找到一个更简单的解决方案。当您从 Internet 网站下载文件时,Windows 会在文件中添加一个额外的流,指示文件的来源。这基本上说明“这个文件不是来自安全的地方”,并使驱动程序安装程序犹豫不决。如果您考虑一下,这是一个相当重要的功能,您的用户将安装可以做很多事情的软件,如果您可以安装驱动程序,您几乎可以自由支配机器。

如果您在资源管理器中右键单击该文件并单击“属性”,那么您将在窗口底部看到:

在此处输入图像描述

所需要做的就是单击该取消阻止按钮。因此,这是您的用户解决问题的一种简单方法。您可以在安装说明中记录额外的步骤。还有一个好处是现在是用户负责允许安装潜在的不安全代码。

解锁文件的其他方法是使用 PowerShell 的Unblock-File 命令和 SysInterals 的流实用程序-d 选项。

您可能应该考虑编写自己的安装程序。这将把驱动程序打包在安装文件中,这样它就不会被 Windows 修改。而用户在启动安装程序时会收到警告。并且可以对其进行签名,因此用户对文件的来源有一定的信心,并且在到达他的机器的过程中不会被弄乱。有许多实用程序可以帮助您编写安装程序,例如 InstallAware、InstallShield、NSIS 等。

于 2013-07-20T12:31:42.520 回答
1

我不同意汉斯的回答:

当然,SEE_MASK_NOZONECHECKS也是一个预定义的环境变量。在进程中更改它然后启动默认情况下继承环境的子进程(例如 msiexec.exe)与使用 ShellExecuteEx() 并提供 SEE_MASK_NOZONECHECKS 作为 SHELLEXECUTEINFO 结构的参数的结果相同。第一种方法是管理员或快速黑客首选的方法,例如,如果您使用设置环境变量的批处理或脚本文件 - 或者当您自己的代码未完成对位于不安全网络驱动器上的 .msi 文件的最终调用时。

例如:

@echo off    
set SEE_MASK_NOZONECHECKS=1
call msiexec.exe /i "\\MY_UNC_DRIVE\installs\mysetup.msi /qb /L*v "c:\logs\mysetup.log"
call "\\MY_UNC_DRIVE\installs\Just_another_setup.exe"

如果您已经在代码中使用了 ShellExecuteEx(),那么当然可以使用 Hans 提到的参数,因为这个实现更加封闭。(如果您使用 CreateProcess(),请考虑使用 ShellExecuteEx()。

回到环境变量。通常,您不能影响已启动进程的环境。您可以通过问题中使用的“setx”命令设置新进程使用的默认环境。但是使用“setx”你不会改变你当前进程的环境。这是有问题的问题。为此,您必须使用“设置”,如图所示。因此,要么依次使用这两个命令,要么根本不使用 setx,因为要在外国机器上运行设置,不询问就进行永久性安全更改是不干净的。

有关永久更改/管理观点的更多详细信息,请参阅: https ://superuser.com/questions/595211/removing-the-open-file-security-warning-in-windows-8/934283#934283

重要提示:如前所述,Windows 中没有通用的方法来影响已经运行的进程(可能只有自己定义的进程间通信),因此在开始设置之前设置环境变量非常重要。

还有一件事:有些人认为,必须在批处理文件中使用“SETLOCAL”。通常这是没有必要的。带有“set”的环境变化不是永久性的,也不包括“其他”进程——它们只被继承到子进程,部分继承到超级进程。但是,当第一层的调用者结束时,环境又恢复到原始状态。

于 2015-06-29T20:05:10.093 回答
0

我最终在安全(自定义级别)下的 Internet Explorer 选项中将“启动应用程序和不安全文件”设置为启用 Internet 区域,然后将更改从 HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3 导出到注册表文件并使用 regedit /s 添加它。

之后,我可以运行共享驱动器的安装程序。

这些天的某一天,我会将注册表文件削减到我猜的最低限度。

PS 我相信这会导致 IE 在启动时默认显示警告页面。

于 2013-07-26T03:14:11.987 回答
0

我相信您需要将所有内容都放在同一个引用中:

cmd /c "set SEE_MASK_NOZONECHECKS=1 & \\server\driver\folder\Autorun.exe /passive /norestart" 

您可以尝试这些并查看输出的差异:

cmd /c "echo foo & echo bar"
cmd /c "echo foo" & "echo bar"
于 2016-01-18T14:43:53.410 回答