Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用BAT/PS脚本自动化安装_Windows_Powershell_Batch File_Automation_Wix - Fatal编程技术网

Windows 使用BAT/PS脚本自动化安装

Windows 使用BAT/PS脚本自动化安装,windows,powershell,batch-file,automation,wix,Windows,Powershell,Batch File,Automation,Wix,我一直在尝试自动安装我的一个应用程序,但遇到了一些障碍,我真的需要一些帮助 目前,我们正在使用Dell的KACE技术将安装程序推送到本地计算机上。安装程序以系统用户身份运行,这意味着它不能直接访问网络共享(稍后相关) 应用程序安装工作流如下所示: 停止本地安全服务以允许软件安装 删除映射到驱动器号X的任何内容 映射网络驱动器X\test\test TestApp.exe/s msiexec/i Test.msi/quiet 启动本地安全服务以允许软件安装 将快捷方式文件复制到桌面 安装本身有1个

我一直在尝试自动安装我的一个应用程序,但遇到了一些障碍,我真的需要一些帮助

目前,我们正在使用Dell的KACE技术将安装程序推送到本地计算机上。安装程序以系统用户身份运行,这意味着它不能直接访问网络共享(稍后相关)

应用程序安装工作流如下所示:
停止本地安全服务以允许软件安装
删除映射到驱动器号X的任何内容
映射网络驱动器X\test\test
TestApp.exe/s
msiexec/i Test.msi/quiet
启动本地安全服务以允许软件安装
将快捷方式文件复制到桌面

安装本身有1个可执行文件和1个必须运行的MSI。EXE安装大型机应用程序。MSI文件在本地安装一些文件,然后在映射驱动器上注册6个DLL文件

这就是问题所在-因为这些文件必须位于该共享驱动器上,并且安装程序以SYSTEM->SYSTEM帐户运行,系统帐户无法访问映射驱动器以注册文件,因此安装失败

我还受到这样一个事实的限制:我不能简单地将用户名/密码以明文形式存储在批处理文件中

以下是我目前的代码:

REM Stopping McAfee Services
echo Stopping McAfee Services.
net stop mcshield
net stop mcafeeframework

REM Map Network Drive
echo Mapping Network Drive
net use X: /delete /y
net use X: \\test\test

(Here is where I need help - Is there a way to force a username/password prompt here for the user? I basically just want the user to authenticate to the X drive mapping, which will allow the installation to move forward)

echo Starting Test 1 Installation
Test1.exe /s /v"/qb"
echo Starting Test 2 Installation
msiexec /i Test2.msi /quiet
(If the drive has not been mapped by this point, the installation fails as the SYSTEM account can't access the drive)

echo.

REM Restarting Mcafee Services
echo Starting McAfee Services.
net start mcshield
net start mcafeeframework
echo.

REM Copy Shortcut
xcopy "shortcut\*" "C:\Users\public\desktop"
或者


我是否可以/应该将其转换为PS脚本?我知道PS比batch更强大,但我不知道该怎么做。

如果强制验证提示意味着需要人工输入(并且您没有远程运行此脚本),那么此行应该与现有登录会话交互并请求凭据:

start explorer \\test\test
echo After you have entered network credentials
pause
一旦用户输入了有效的脚本,剩余的脚本就可以继续了

net use X: \\test\test

在对这个问题玩弄了几个星期之后,我决定采取一种新的方法

我使用简单的网络使用创建了一个新的批处理文件,并以纯文本形式传递了一个服务帐户的凭据,该帐户具有访问网络共享的权限。接下来,我将批处理编译成一个可执行文件。我相信这不是最优雅的解决方案,但它足以满足我们目前的需求


谢谢大家的帮助

在Powershell中,您当然可以使用带有
-credential
参数的
新PSDrive
来映射驱动器。然而,如果这是无人参与的,那么就不能回避将凭证以纯文本形式保存在某处。难道不可能用另一个账户来管理整个事情吗?据我所知,不可能。我们仅限于以系统用户(不具有共享驱动器访问权限)或用户身份运行脚本,但该用户没有运行安装的管理员权限。在我们当前的环境中,无法将用户提升为管理员。另请注意:当我正在将其转换为powershell脚本时,我发现新的PSDrive参数,如-credential和-persist不起作用(我在PS中遇到了无效的参数错误)。除了X驱动器是网络驱动器且系统帐户不可用外,我看不到应用程序如何工作。驱动器号映射在用户配置文件上下文(而不是整个系统)中,因此如果您在该驱动器上的某个帐户下注册文件,则其他帐户将看不到这些文件。也许每个用户通过共享名而不是驱动器号访问它?组策略是适用于您的场景的常见解决方案,它通过运行凭据来避免此问题,如果需要,可以提升instal的凭据。应用程序本身安装在服务器“X”上。工作站安装程序也在本地客户端上运行,因为有一些文件必须在本地安装。供应商将安装程序设计为在注册DLL时指向X驱动器。不确定这是否回答了你的问题。我认为GPO解决不了这个问题:事实上,我们要么需要两件事中的一件:要么我们需要从系统帐户访问共享驱动器——我所知道的唯一方法是在同一个安装实例中使用有效用户的凭据映射共享。要么安装程序以用户身份运行,并向用户提供local admin privs-这完全不起作用。因此,我不确定explorer\\test\test是否实际执行了与原始脚本不同的操作。事实上,我根本看不到它在做什么。在我删除任何现有连接的线路和我的网络使用X:line之间,现在有一个巨大的暂停,在45秒左右的时间里似乎什么都没有发生,然后它继续前进。网络使用确实会在CMD中提示输入用户名和密码,但不会循环无效的凭据-我需要它循环,直到用户输入凭据。现在我不清楚两个方面。您的脚本是否从交互式会话运行(即使用登录会话-UI和all)?如果有人正在监视会话,则explorer\\test\test行应该询问凭据。如果没有监控,请删除该行。接下来,您是否已经知道\\test\test的凭据?如果存储为环境变量将起作用,net use X:\\test\test/用户:%network\u username%%network\u password%将为您获取映射。是的,它是从交互式会话运行的-尽管我们希望安装尽可能安静。不能以纯文本形式存储用户名/密码。“资源管理器”在这个脚本中完全没有为我做任何事情,这个脚本似乎只是忽略了这一行,转而使用网络。使用netuse,我可以让CMD提示输入网络ID和密码,但并没有验证。如果用户输入了错误的ID/密码,安装就会失败。我们需要凭证部分循环,直到成功验证。谢谢Kevin。我刚刚编辑了我的答案,在浏览器行之前添加了一个“开始”关键字。好吧,我给了这个一个机会,这样就行了。当我在我的网络帐户下运行start explorer\\test\test时,它会根据