2014-07-04 64 views
2

如何获取安装在网络计算机上的软件列表。按IP地址列出网络计算机上安装的所有软件

我能够获得为本地计算机安装的软件列表,但不知道如何在网络中的计算机上提取已安装软件的详细信息。

我有网络计算机的服务器名称或IP地址作为唯一的输入。请引导我并帮助我实现这一目标。

下面是我执行了,直到如今它正从本地机器上安装软件的详细信息代码:

const string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; 

private void ListSoftwareInstalled(string servername) 
{ 
    var result = new List<string>(); 
    result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry32)); 
    result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry64)); 

    if (result != null && result.Count > 0) 
    { 
     // Convert to DataTable. 
     DataTable table = ConvertListToDataTable(result); 
     foreach (var column in table.Columns.Cast<DataColumn>().ToArray()) 
     { 
      if (table.AsEnumerable().All(dr => dr.IsNull(column))) 
       table.Columns.Remove(column); 
     } 
     table.Columns["Column1"].ColumnName = "Installed Software"; 
     GenerateExcel(table); 
    } 
} 


private DataTable ConvertListToDataTable(List<string> result) 
{ 
    // New table. 
    DataTable table = new DataTable(); 

    // Get max columns. 
    int columns = 0; 
    foreach (var array in result) 
    { 
     if (array.Length > columns) 
      columns = array.Length; 
    } 

    // Add columns. 
    for (int i = 0; i < columns; i++) 
     table.Columns.Add(); 

    // Add rows. 
    foreach (var array in result) 
     table.Rows.Add(array); 

    return table; 
} 

private static IEnumerable<string> GetInstalledProgramsFromRegistry(RegistryView registryView) 
{ 
    var result = new List<string>(); 

    using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView).OpenSubKey(registry_key)) 
    { 
     foreach (string subkey_name in key.GetSubKeyNames()) 
     { 
      using (RegistryKey subkey = key.OpenSubKey(subkey_name)) 
      { 
       if (IsProgramVisible(subkey)) 
       { 
        result.Add((string)subkey.GetValue("DisplayName")); 
       } 
      } 
     } 
    } 
    return result; 
} 

private static bool IsProgramVisible(RegistryKey subkey) 
{ 
    var name = (string)subkey.GetValue("DisplayName"); 
    var releaseType = (string)subkey.GetValue("ReleaseType"); 
    //var unistallString = (string)subkey.GetValue("UninstallString"); 
    var systemComponent = subkey.GetValue("SystemComponent"); 
    var parentName = (string)subkey.GetValue("ParentDisplayName"); 

    return !string.IsNullOrEmpty(name) && 
      string.IsNullOrEmpty(releaseType) && 
      string.IsNullOrEmpty(parentName) && 
      (systemComponent == null); 
} 

private void GenerateExcel(DataTable dt) 
{ 
    XL.Application oXL; 
    XL._Workbook oWB; 
    XL._Worksheet oSheet; 
    XL.Range oRng; 

    try 
    { 
     oXL = new XL.Application(); 
     Application.DoEvents(); 
     oXL.Visible = false; 
     //Get a new workbook. 
     oWB = (XL._Workbook)(oXL.Workbooks.Add(Missing.Value)); 
     oSheet = (XL._Worksheet)oWB.ActiveSheet; 
     //System.Data.DataTable dtGridData=ds.Tables[0]; 
     int iRow = 2; 
     if (dt.Rows.Count > 0) 
     { 
      for (int j = 0; j < dt.Columns.Count; j++) 
      { 
       oSheet.Cells[1, j + 1] = dt.Columns[j].ColumnName; 
      } 
      // For each row, print the values of each column. 
      for (int rowNo = 0; rowNo < dt.Rows.Count; rowNo++) 
      { 
       for (int colNo = 0; colNo < dt.Columns.Count; colNo++) 
       { 
        oSheet.Cells[iRow, colNo + 1] = dt.Rows[rowNo][colNo].ToString(); 
       } 
       iRow++; 
      } 
      iRow++; 
     } 
     oRng = oSheet.get_Range("A1", "IV1"); 
     oRng.EntireColumn.AutoFit(); 
     oXL.Visible = true; 
    } 
    catch (Exception theException) 
    { 
     throw theException; 
    } 
    finally 
    { 
     oXL = null; 
     oWB = null; 
     oSheet = null; 
     oRng = null; 
    } 
} 

预先感谢在这个问题寻找它,花费您宝贵的时间。

+0

是你的问题有关特定版本的C#?如果不是,你不需要使用'c#-4.0 c#-3.0 c#-2.0 c#-5.0'标签.. –

+0

感谢@Soner引导me.My问题与任何特定版本的C#无关。为了使这个问题可用于所有特定版本的C#用户,我也做了.Apology并再次感谢。 –

+0

可能重复的[如何阅读远程注册表键?](http://stackoverflow.com/questions/1566547/how-to-read-remote-registry-keys) – scheien

回答

2
private static List<string> ReadRemoteRegistryusingWMI(string machineName) 
     { 
     List<string> programs = new List<string>(); 

     ConnectionOptions connectionOptions = new ConnectionOptions(); 
     connectionOptions.Username = @"*******"; 
     connectionOptions.Password = "*******"; 
     //connectionOptions.Impersonation = ImpersonationLevel.Impersonate; 
     ManagementScope scope = new ManagementScope("\\\\" + machineName + "\\root\\CIMV2", connectionOptions); 
     scope.Connect(); 

     string softwareRegLoc = @"Software\Microsoft\Windows\CurrentVersion\Uninstall"; 

     ManagementClass registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null); 
     ManagementBaseObject inParams = registry.GetMethodParameters("EnumKey"); 
     inParams["hDefKey"] = 0x80000002;//HKEY_LOCAL_MACHINE 
     inParams["sSubKeyName"] = softwareRegLoc; 

     // Read Registry Key Names 
     ManagementBaseObject outParams = registry.InvokeMethod("EnumKey", inParams, null); 
     string[] programGuids = outParams["sNames"] as string[]; 

     foreach (string subKeyName in programGuids) 
      { 
      inParams = registry.GetMethodParameters("GetStringValue"); 
      inParams["hDefKey"] = 0x80000002;//HKEY_LOCAL_MACHINE 
      inParams["sSubKeyName"] = softwareRegLoc + @"\" + subKeyName; 
      inParams["sValueName"] = "DisplayName"; 
      // Read Registry Value 
      outParams = registry.InvokeMethod("GetStringValue", inParams, null); 

      if (outParams.Properties["sValue"].Value != null) 
       { 
       string softwareName = outParams.Properties["sValue"].Value.ToString(); 
       programs.Add(softwareName); 
       } 
      } 

     return programs; 
     } 

从上面的代码,现在我能够列出安装在远程computer.Thanks大家的帮助和支持的所有软件。

+0

请问你能告诉我什么是机器名称,用户名和密码? –

相关问题