2011-08-01 8 views
6

私は長い時間を探していますが、回答が見つかりませんでした。 C#のレジストリにアクセスせずに、.NETにインストールされているフレームワークとサービスパックを判別する方法はありますか? 私はレジストリキーを使うことができますが、私はレジストリへのアクセスなしでこれを行う必要があります。 私はC:\ Windows \ Microsoft .NETのディレクトリについて何かを読んだが、そこにはフレームワークのバージョンしか見つからず、SPについては何も見つかりませんでした。しかし、私はフレームワークとサービスパックが必要です。 誰かが私を助けることができますか?レジストリのないフレームワークのバージョンを判断する方法

よろしく、グレッグ

+1

なぜあなたは、レジストリを使用することはできません。

ここでは、コードですか? – SLaks

+1

私はレジストリにアクセスする権限を持っていないユーザーのためにこれをやっているので。 – ogrod87

+1

あなたは常にレジストリへのアクセス権を持っています。あなたは書き込みアクセス権を持っていないかもしれませんが、あなたは読み取りアクセス権を持っています。 (信頼できないコードを実行している場合を除いて、ファイルシステムにアクセスすることはできません) – SLaks

答えて

4
string clrVersion = System.Environment.Version.ToString(); 
string dotNetVersion = Assembly 
         .GetExecutingAssembly() 
         .GetReferencedAssemblies() 
         .Where(x => x.Name == "mscorlib").First().Version.ToString(); 
+3

'typeof(string).Assembly' – SLaks

+0

@SLaks:良い点ですが、私にとっては読みにくいです。 – sll

+0

これはサービスパックの情報も取得しません。 –

0

私はそれがWMIに依頼することも可能だと思います。すべてのWin32_Productの要素のための

クエリとNameプロパティを探して「は、Microsoft .NET Framework」が含まれてい

サービスパックの情報もWMIによって提供されて..しかし、私は場所を正確に知りません。

+0

これはOverkill – sll

+0

ですが、ディレクトリ構造の解析としてより安全です。 –

0

あなたはこれを行うことができます。

System.Environment.Version.ToString() 

CLRバージョンをのみ

またはUpdated sample .NET Framework detection code that does more in-depth checking

上のMSDNのブログから、この

またはこの

レジストリへのアクセスがありませんthis blogから借りています。

using System; 
using System.IO; 
using System.Security; 
using System.Text.RegularExpressions; 

namespace YourNameSpace 
{ 
    public class SystemInfo 
    { 
     private const string FRAMEWORK_PATH = "\\Microsoft.NET\\Framework"; 
     private const string WINDIR1 = "windir"; 
     private const string WINDIR2 = "SystemRoot"; 

     public static string FrameworkVersion 
     { 
      get 
      { 
       try 
       { 
        return getHighestVersion(NetFrameworkInstallationPath); 
       } 
       catch (SecurityException) 
       { 
        return "Unknown"; 
       } 
      } 
     } 

     private static string getHighestVersion(string installationPath) 
     { 
      string[] versions = Directory.GetDirectories(installationPath, "v*"); 
      string version = "Unknown"; 

      for (int i = versions.Length - 1; i >= 0; i--) 
      { 
       version = extractVersion(versions[i]); 
       if (isNumber(version)) 
        return version; 
      } 

      return version; 
     } 

     private static string extractVersion(string directory) 
     { 
      int startIndex = directory.LastIndexOf("\\") + 2; 
      return directory.Substring(startIndex, directory.Length - startIndex); 
     } 

     private static bool isNumber(string str) 
     { 
      return new Regex(@"^[0-9]+\.?[0-9]*$").IsMatch(str); 
     } 

     public static string NetFrameworkInstallationPath 
     { 
      get { return WindowsPath + FRAMEWORK_PATH; } 
     } 

     public static string WindowsPath 
     { 
      get 
      { 
       string winDir = Environment.GetEnvironmentVariable(WINDIR1); 
       if (String.IsNullOrEmpty(winDir)) 
        winDir = Environment.GetEnvironmentVariable(WINDIR2); 

       return winDir; 
      } 
     } 
    } 
} 

Here is an improved example that includes service packs

string path = System.Environment.SystemDirectory; 
path = path.Substring(0, path.LastIndexOf('\\')); 
path = Path.Combine(path, "Microsoft.NET"); 
// C:\WINDOWS\Microsoft.NET\ 

string[] versions = new string[]{ 
    "Framework\\v1.0.3705", 
    "Framework64\\v1.0.3705", 
    "Framework\\v1.1.4322", 
    "Framework64\\v1.1.4322", 
    "Framework\\v2.0.50727", 
    "Framework64\\v2.0.50727", 
    "Framework\\v3.0", 
    "Framework64\\v3.0", 
    "Framework\\v3.5", 
    "Framework64\\v3.5", 
    "Framework\\v3.5\\Microsoft .NET Framework 3.5 SP1", 
    "Framework64\\v3.5\\Microsoft .NET Framework 3.5 SP1", 
    "Framework\\v4.0", 
    "Framework64\\v4.0" 
}; 

foreach(string version in versions) 
{ 
    string versionPath = Path.Combine(path, version); 

    DirectoryInfo dir = new DirectoryInfo(versionPath); 
    if(dir.Exists) 
    { 
     Response.Output.Write("{0}<br/>", version); 
    } 
} 

問題は、彼らが出てくるようバージョンに追いつくために持っているということです。

+0

サンプルを正しく理解すれば、必要に応じてサービスパック情報を取得できません。 –

+0

はい、正しいです。 –

+0

@ 0xA3:Service Packを含む改善された別の例が追加されました。 –

-1

このページは有用であり得る: http://blogs.msdn.com/b/astebner/archive/2009/06/16/9763379.aspx

レジストリビットは、あなたには無関係ですが、にmscoree.dllを使用してチェックが助けになることも - 私は仕事からのSkyDriveにアクセスカントそのことだけので、カントが目を通しますコード。

私は別のものを見つけるかどうか見てください。

2

あなたがインストールされているすべての製品のリストを取得するには、MSIのAPI関数を使用して、かどうかを確認することができ、あなたの目標

public static class MyClass 
    { 
     public static void Main() 
     { 
      ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product"); 
      foreach (ManagementObject mo in mos.Get()) 
      { 
       Console.WriteLine(mo["Name"]); 
      } 


     } 
    } 
0

を達成するために、結果をフィルタリングし、すべてのインストール済みソフトウェアのリストを取得するには、WMIを使用することができます必要な.NET Frameworkバージョンがインストールされます。

これらの機能がレジストリから読み取られることを上司に伝えないでください。

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 
using System.Text; 

class Program 
{ 
    [DllImport("msi.dll", SetLastError = true)] 
    static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf); 

    [DllImport("msi.dll", CharSet = CharSet.Unicode)] 
    static extern Int32 MsiGetProductInfo(string product, string property, [Out] StringBuilder valueBuf, ref Int32 len); 

    public const int ERROR_SUCCESS = 0; 
    public const int ERROR_MORE_DATA = 234; 
    public const int ERROR_NO_MORE_ITEMS = 259; 

    static void Main(string[] args) 
    { 
     int index = 0; 
     StringBuilder sb = new StringBuilder(39); 
     while (MsiEnumProducts(index++, sb) == 0) 
     { 
      var productCode = sb.ToString(); 
      var product = new Product(productCode); 
      Console.WriteLine(product); 
     } 
    } 

    class Product 
    { 
     public string ProductCode { get; set; } 
     public string ProductName { get; set; } 
     public string ProductVersion { get; set; } 

     public Product(string productCode) 
     { 
      this.ProductCode = productCode; 
      this.ProductName = GetProperty(productCode, "InstalledProductName"); 
      this.ProductVersion = GetProperty(productCode, "VersionString"); 
     } 

     public override string ToString() 
     { 
      return this.ProductCode + " - Name: " + this.ProductName + ", Version: " + this.ProductVersion; 
     } 

     static string GetProperty(string productCode, string name) 
     { 
      int size = 0; 
      int ret = MsiGetProductInfo(productCode, name, null, ref size); if (ret == ERROR_SUCCESS || ret == ERROR_MORE_DATA) 
      { 
       StringBuilder buffer = new StringBuilder(++size); 
       ret = MsiGetProductInfo(productCode, name, buffer, ref size); 
       if (ret == ERROR_SUCCESS) 
        return buffer.ToString(); 
      } 

      throw new System.ComponentModel.Win32Exception(ret); 
     } 
    } 
} 
関連する問題