2011-05-23 109 views
3

我想在远程计算机上安装MSI软件包。 本地和远程计算机都是域名“adn.lan” 的成员,并且我作为连接参数传递的用户/密码具有对远程计算机的完全访问权限。 当我设置connection.Authority“ntdlmdomain:adran.lan”返回参数显示“无效参数”当我离开它,因为null并使其为说,在connect()将连接成功,但是当它试图安装包的返回参数显示被解决的包是不可访问的由WMI进行远程安装的问题:远程计算机无法访问安装软件包

这是我试过的代码。

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到身份的结果将是“访问被拒绝”。

+0

现在我决定将MSI软件包复制到远程机器,然后从本地解决文件路径以解决问题但我仍然对获得更好的解决方案感兴趣。 – 2011-05-24 07:59:58

回答

3

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

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

TechNet对模拟级别有很好的总结,请参阅表6.6 DCOM模拟级别位于WMI Security Settings的顶部。

p.s.为了好玩,你可能会看到是否有办法做到这一点,而不复制到目标机器。如果您能找到一种方法将安装包文件以允许匿名访问的方式公开给网络,我想知道是否允许第二跳,因为只需要匿名凭证?但不知道。如果你像我一样,可能会出现很多猜测和测试:)

相关问题