2011-05-23 54 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.爲了好玩,你可能會看到是否有辦法做到這一點,而不復制到目標機器。如果您能找到一種方法將安裝包文件以允許匿名訪問的方式公開給網絡,我想知道是否允許第二跳,因爲只需要匿名憑證?但不知道。如果你像我一樣,可能會出現很多猜測和測試:)