如何在不重启的情况下使用SEE_MASK_NOZONECHECKS运行msi

时间:2013-07-18 06:29:25

标签: windows security cmd install windows-installer

我正在尝试使用远程框架安装驱动程序,该驱动程序允许我运行作为远程计算机上的远程处理/监视应用程序的子项生成的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 个答案:

答案 0 :(得分:3)

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

让我们谈谈真正发生的事情,你可能会找到一个更简单的解决方案。从Internet网站下载文件时,Windows会向该文件添加一个额外的流,以指示文件的来源。这基本上说“这个文件不是来自一个安全的地方”,并使驱动程序安装程序balky。这是一个非常重要的功能,如果您考虑一下,您的用户将安装可以执行批次的软件,如果您可以安装驱动程序,那么您几乎可以自由控制机器。< / p>

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

enter image description here

只需单击“取消阻止”按钮即可。因此,这是用户解决问题的简单方法。您可以在安装说明中记录额外步骤。另外还有一个优点,就是现在用户负责安装可能不安全的代码。

让文件解除阻止的其他方法是使用PowerShell的Unblock-File command和SysInterals'streams utility, - d选项。

你可能应该考虑编写自己的安装程序的选项。这将使驱动程序打包在安装文件中,因此Windows不会对其进行修改。并且用户在启动安装程序时会收到警告。并且它可以被签名,因此用户对文件来自哪里有信心,并且在去往他的机器的路上没有被搞砸。有许多实用程序可以帮助您编写安装程序,如InstallAware,InstallShield,NSIS等。

答案 1 :(得分:1)

我不同意Hans&#39;回答:

当然,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()。

返回环境变量。通常,您无法影响已启动流程的环境。您可以通过&#34; setx&#34;设置NEW流程使用的默认环境。问题中使用的命令。 但是&#34; setx&#34;你不会改变当前流程的环境。这就是问题所在。为此,你必须使用&#34; set&#34;如图所示。因此,要么在彼此之后使用两个命令,要么根本不使用setx,因为在外部计算机上运行设置,如果不进行询问就不能进行永久性的安全更改。

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

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

还有一件事:有些人认为,必须使用&#34; SETLOCAL&#34;在批处理文件中。通常这不是必需的。环境随着&#34;设置&#34;而变化不是永久性的,不包括其他&#34;其他&#34;进程 - 它们只继承到子进程,部分继承到超进程。但是,当第一级别的呼叫者结束时,环境将再次恢复到原始状态。

答案 2 :(得分:0)

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

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

有一天我会将注册表文件削减到最低限度。

P.S。我相信这会导致IE在启动时默认为警告页面。

答案 3 :(得分: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"