3

我想在远程计算机上安装 MSI 包。本地和远程计算机都是名为“adn.lan”的域的成员,并且我作为参数传递给连接的用户/密码对远程计算机具有完全访问权限。当我将connection.Authority设置 为“ntdlmdomain:adran.lan”时,返回参数显示“无效参数”,当我将其保留为null并使其成为备注时,connect()将成功连接,但当它尝试安装包时,返回参数显示寻址的包是不可访问的。

这是我尝试过的代码。

ConnectionOptions connection = new ConnectionOptions();
//connection.Authority = "ntdlmdomain:adn.lan"; // "kerberos:" + domain + @"\" + machine;
connection.Username = username;
connection.Password = password;
//connection.Impersonation = ImpersonationLevel.Identify ;
connection.Authentication = AuthenticationLevel.Packet;

ManagementScope scope = new ManagementScope("\\\\RemoteMachineName\\root\\CIMV2", connection);
scope.Connect();

ManagementPath p = new ManagementPath("Win32_Product");                
ManagementClass classInstance = new ManagementClass(scope, p, null);
ManagementBaseObject inParams = classInstance.GetMethodParameters("Install");

inParams["AllUsers"] = true; 
inParams["Options"] = string.Empty;
inParams["PackageLocation"] = "\\\\LocalMachineName\\Share\\Prescription.msi";                

ManagementBaseObject outParams = classInstance.InvokeMethod("Install", inParams, null);                

string retVal = outParams["ReturnValue"].ToString();

当我设置theconnection.Impersonation为身份时,结果将是“拒绝访问”。

4

1 回答 1

3

如果我理解您的问题和后续评论,您会发现当包路径位于与目标计算机不同的计算机上时(即 UNC 路径,通常可从目标计算机访问),它将无法工作。但是,当您将包复制到目标机器并传递目标机器上的本地路径时,安装工作正常。

我相信失败的原因是由于 DCOM 模拟级别的性质。
模拟允许您在目标机器上使用调用者的凭据,但不能从目标机器连接到另一台机器。要使用相同的凭据进行第二个跃点,需要委托级别。(问题是,这有安全风险,所以所有的指导都说“警告警告警告”,默认情况下一切都很难。)
当您要求目标机器访问单独网络位置上的安装包时,这是一个需要凭据的“第二跳”,但模拟意味着您只能在目标机器上使用您的凭据,而不是从那里传递到远程文件位置。

TechNet 对模拟级别进行了很好的总结,请参阅WMI 安全设置顶部的表 6.6 DCOM 模拟级别

ps 为了好玩,您可能会看看是否有一种方法可以在不复制到目标机器的情况下做到这一点。如果您能找到一种方法以允许匿名访问的方式将安装包文件公开给网络,我想知道是否允许第二跳,因为只需要匿名凭据?不过不确定。如果你和我一样,可能会有大量的猜测和测试:)

于 2011-05-28T18:05:29.070 回答