【问题标题】:Copying files to remote server with a Setup Project使用安装项目将文件复制到远程服务器
【发布时间】:2011-10-08 03:16:33
【问题描述】:

我正在尝试创建一个安装程序包,它不仅可以安装我们的应用程序,还可以将文件复制到远程应用程序服务器并在那里安装服务。我以为我会在自定义操作中覆盖 install 方法,让它启动一个 powershell 脚本来复制文件。不幸的是,当代码调用 powershell 脚本时,我得到了这个 CmdletProviderInvocationException

系统检测到可能存在危害安全性的尝试。请确保您可以联系对您进行身份验证的服务器。

我能够将我用来调用 powershell 脚本的代码复制到一个测试项目中,它运行得很好,正如我所期望的那样,因为我已经通过 Windows 资源管理器登录到服务器,所以我的用户应该经过身份验证.我认为脚本在安装程序调用时不起作用的原因一定是安装程序切换用户以获得安装应用程序的管理员权限,并且管理员用户未经过身份验证(尽管我可能是错误的)。

有谁知道我怎样才能让它工作?

这是自定义操作代码:

Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();
string scriptLoc = "c:\\sampleLocation";
pipeline.Commands.AddScript("&\"" + scriptLoc + "\\script.ps1\"");

Collection<PSObject> results = pipeline.Invoke();

runspace.Close();

这是脚本:

$RemotePath = "\\SERVER\C$\Shared\Service"
$Source = "C:\sampleLocation\Service"

Get-ChildItem $Source -Recurse | Copy-Item -Destination $RemotePath

【问题讨论】:

  • 您在哪个操作系统上运行您的设置?
  • 应该在 Windows 7 和/或 Windows Server 2003 上工作
  • 我想我明白了,但它很难看。我有自定义操作调用批处理文件: runas /netonly /user:DOMAIN\user "powershell &'C:\path\script.ps1'" 它确实提示输入密码,这意味着它不是完​​全自动的。我可能会研究一下 SendKeys(我觉得我正在使用胶带和回形针......)
  • 当你在做丑陋的事情时,你可以执行一个 powershell 脚本,以另一个用户的身份执行另一个脚本。这样做您可以将加密的凭据存储在磁盘上。
  • 关于它的任何最终解决方案?

标签: c# deployment scripting powershell setup-project


【解决方案1】:

将文件复制到网络位置有两个主要要求:

MSI 安装在本地系统帐户下运行。所以不管你有没有权限。

由于从网络机器向 SYSTEM 帐户授予权限并不容易,因此最简单的方法是向所有人授予完全权限。这需要在包含共享文件夹的机器上完成。

【讨论】:

  • 在 Windows 七 MSI 安装在“LocalSystem”帐户或“TrustedInstaller”下运行?
【解决方案2】:

根据@Cosmin Pirvu 和微软文档:

LocalSystem 帐户是服务控制管理器使用的预定义本地帐户。它在本地计算机上具有广泛的权限,并充当网络上的计算机。

如果您的共享文件夹位于域中的计算机上,您可以向客户端计算机授予完全权限,尽管将其授予所有人。

【讨论】:

    猜你喜欢
    • 2011-05-09
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2013-12-03
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多