我想在远程计算机上安装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
设置为Identity时,结果将是“拒绝访问”。
答案 0 :(得分:3)
如果我理解您的问题和后续评论,您会发现当程序包路径位于与目标计算机不同的计算机上时(即通常可从目标计算机访问的UNC路径),它将无效。但是,将程序包复制到目标计算机并在目标计算机上传递本地路径时,安装将起作用。
我认为失败的原因是由于DCOM假冒级别的性质
模拟允许您使用目标计算机上的呼叫者凭据 - 但不从目标计算机连接到另一台计算机。要使用相同凭据进行第二跳,需要委派级别。 (问题是,这有安全风险,因此所有指导都说“警告警告警告”,一切都使得默认很难。)
当您要求目标计算机在单独的网络位置访问安装包时,这是需要凭据的“第二跳”,但是模拟意味着您只能在目标计算机上使用您的凭据,而不是从那里传递到远程文件位置。
TechNet对模拟级别有一个很好的总结,请参阅WMI Security Settings顶部的表6.6 DCOM模拟级别。
P.S。为了好玩,您可能会看到是否有办法在不复制到目标计算机的情况下执行此操作。如果您能找到一种方法以允许匿名访问的方式将安装包文件公开到网络,我想知道是否允许第二跳,因为只需要匿名凭据?不过不确定。如果你像我一样,可能会有很多猜测和测试:)