2009-08-20 3 views
7

会社の数百台のコンピュータで使用されているアプリケーションがあり、アプリケーションのインストールディレクトリにINIファイルを変更する必要があります。ユーザーはいつでもどこでもアプリケーションをインストールでき、いつでも複数のバージョンのアプリケーションをインストールできます。私はそのインストールディレクトリを見つけることができる必要があります。第三者アプリケーションのインストールディレクトリを決定する

  • 名前で製品を検索し、そのインストールディレクトリを見つけるためにいるWindowsInstallerを使用した:私はこれまで考えられてきた

    方法。 (hereから)。 - これはほとんど機能しましたが、移入すると予想されるプロパティ(TARGETDIR、APPDIR)はありません。

  • 特定のアプリのインストールディレクトリを見つけるためにレジストリを調べます。そこにはない。
  • MsiGetComponentPath()?私はこれを上記の同じリンクで見ましたが、実装方法はわかりません。 Windows Installerを使用してProductIDを取得することはできますが、プログラムでコンポーネントを選択してIDをランダムに見つける方法はわかりません。誰でも?

いいえ、Windowsアプリケーションのインストールディレクトリをプログラムで判断する方法は他にもあります。

答えて

7

まあ、私は私のために働いた解決策を考え出した:

 Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer"); 
     Installer msi = (Installer)Activator.CreateInstance(type); 
     foreach (string productcode in msi.Products) 
     { 
      string productname = msi.get_ProductInfo(productcode, "InstalledProductName"); 
      if (productname.Contains("<APPLICATION NAME>")) 
      { 
       string installdir = msi.get_ProductInfo(productcode, "InstallLocation"); 
      } 
     } 
+5

誰でもどのDLLが 'Installer'のために参照されるべきなのか、C:\ windows \ system32 \ msi.dllにあります。 – Jedidja

+0

WindowsInstallerを使用しています。 – RAM

1

インストールがMSIの場合、WMIからの情報の取得は簡単です。 Win32_Productクラスには、この情報を保持するInstallLocationプロパティがあります。 WMIを使用して

2

は、一部の人のために働く可能性があり、残念ながら私たちのユーザーは、彼らが自分のマシン上でこれを実行できるようにする資格情報を持っていません。

 ManagementObjectSearcher search = new ManagementObjectSearcher("Select InstallationLocation from Win32_Product"); 
     ManagementObjectCollection results = search.Get(); 

     foreach (ManagementObject mo in results) 
     { 
      Console.WriteLine(mo["InstallLocation"]); 
     } 
+0

この問題を解決する方法は非常にクールです。 :) – Jedidja

+1

'Win32_Product'は悪です、それを使わないでください: http://sdmsoftware.com/wmi/why-win32_product-is-bad-news/ – Breeze

+0

@Hossein - Yikes、頭のおかげで、 – snicker