如何通过IP地址列出网络计算机上所有已安装的软件?

2024-03-14

我想知道如何获取网络计算机上安装的软件列表。

我能够获取本地计算机上安装的软件列表,但不确定如何提取网络内计算机上已安装软件的详细信息。

我使用服务器名称或网络计算机的 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;
    }
}

请帮助并指导我实现这一目标。 预先感谢您查看此问题并花费您宝贵的时间。


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;
        }

从上面的代码中,现在我可以列出远程计算机上安装的所有软件。感谢大家的帮助和支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过IP地址列出网络计算机上所有已安装的软件? 的相关文章

随机推荐

  • 解决 Laravel 迁移文件的此错误:每个类必须位于至少一级的命名空间中

    如何解决这个 phpcs 错误 它出现在班级中Keyword在所有 Laravel 迁移文件中 错误信息是 每个类必须位于至少一个级别的命名空间中 顶级 供应商名称 phpcs 您可以通过几种不同的方式来做到这一点 首先 您可以将其放在文件
  • 将字段替换为另一个文件中指定的值

    我有一个包含单词之间的映射的文件 我必须引用该文件并将这些单词替换为某些文件中的映射单词 例如 下面的文件具有映射的单词表 1 12 2 4 1 1 12 2 7 12 1 12 2 2 5 1 12 2 4 4 1 12 2 6 67 1
  • rgeos::gCentroid() 和 sf::st_centroid() 返回的值是否不同?

    Question 返回的值是否为rgeos gCentroid https www rdocumentation org packages rgeos versions 0 3 26 topics gCentroid and sf st c
  • Excel VBA 使用 FileSystemObject 列出文件的上次修改日期

    这是我第一次提出问题 所以希望我遵守协议 这是参考 在vba中获取子目录列表 在vba中获取子目录列表 https stackoverflow com questions 9827715 get list of subdirs in vba
  • 如何仅使用 Jackson 将 XML 转换为 JSON?

    我从服务器收到 XML 格式的响应 但我需要以 JSON 格式显示它 有没有办法不用第三方API就可以转换呢 我使用了 Jackson 但为此我需要创建 POJO 服务器的响应是这样的
  • 如何获取数组的所有子集?

    给定一个数组 dog cat mouse 最优雅的创建方式是什么 mouse cat cat mouse dog dog mouse dog cat dog cat mouse 我需要它适用于任何大小的数组 这本质上是一个二进制计数器 其中
  • 谷歌索引页面加载后通过ajax或javascript检索的文本

    几个谷歌问题 1 谷歌是否有机会 看到 使用ajax检索的文本 用户从一系列选择框中进行选择 然后显示数据库中的一些文本 2 如果我使用javascript更改页面标题 在HEAD区域之外 谷歌会索引修改后的标题吗 抱歉 如果这些是琐事问题
  • 如何快速隐藏/显示按钮

    我正在尝试使用 if 语句来使按钮在标签显示某种状态时隐藏 并在标签显示其他内容时出现 标签的名称是 Status 当它显示时 Closed 我希望它隐藏 当它显示时 Open 就会出现 var query3 PFQuery classNa
  • 在自定义 JSF 组件收到 AJAX 更新后调用自定义 JavaScript 代码

    我已经实现了自己的 JSF 组件及其渲染器 并且运行良好 目前 在更改组件树中的某些内容后 我开始重新加载 JavaScript 页面 现在我想在 AJAX 调用传递新数据后更新我的组件 这就像我在单击按钮后向表中插入新行 这会启动 AJA
  • PHP 通过类传递对象?

    重建整个类布局后 我在使用多个类实例时仍然遇到问题 class User public variable public function getUser this gt variable It works return bob class
  • Twilio 通话应用账单扣除

    我们正在制作三种方式调用 Android 应用程序 两个参与者是应用程序用户 第三个参与者是使用 TWILIO 的任何电话号码 我们已经实现了通话功能 我们的通话正在接通 但问题是 我们需要在服务器端知道谁是发起呼叫的用户 以便我们可以从该
  • 如何在本地服务器上安装CloudFoundry

    我知道 CF 是为在多个云服务上运行而设计的 以实现微服务应用程序的统一视图 但是 我想在我的 CentOS 本地服务器上安装并运行 Cloud Foundry 换句话说 我想在一台运行 CF 的服务器上设置我的私有 云 作为基于微服务的应
  • 如何在 tkinter 中滚动到 TreeView 的底部

    我在 Tkinter 中使用树视图模仿了一个表格小部件 并添加一个链接到它的滚动条 问题是因为我的数据是按分钟自动添加到底部的 并且我希望滚动始终滚动到底部 我知道 text see END 在文本小部件中完美工作 但就我而言 树视图小部件
  • Java NoSuchAlgorithmException - SunJSSE、sun.security.ssl.SSLContextImpl$DefaultSSLContext

    背景 我一直在它自己的 Eclipse 项目中使用 Authorize net SDK 一切都运转良好 然后我需要将其添加到我的主项目中 我将依赖项添加到类路径中 并将其复制到我需要的代码块中 它应该有效 Problem 长话短说 代码在我
  • 表单验证失败后重新填充 Codeigniter 中的复选框

    在表单验证不成功将用户返回到同一表单后 我在重新填充一组复选框时遇到问题 下拉菜单和文本输入可以重新填充 但复选框不能 这是复选框的代码片段 td Casual br Romantic br td
  • 如何获取 Xamarin.Forms 中嵌入文件的 URL/路径

    我无法访问 Xamarin Forms 项目中嵌入的 mp4 文件 根据Xamarin Forms 中的文件处理 https learn microsoft com en us xamarin xamarin forms app funda
  • SassError:找不到要导入的样式表。 @use '~@angular/material' 作为垫子;

    我使用 CLI 创建了一个 Angular 项目 我正在使用 SCSS 并且我将 Angular Material 包含在自定义主题 iirc 中 我添加了几个虚拟组件 应用程序仍然构建得很好 然后我需要使用 Angular Materia
  • Swift 3 类型“Any”没有下标成员

    我刚刚将我的项目转换为 Swift 3 我这里有这行代码 let type self data indexPath row Type as String 但现在我得到这个错误 Type Any has no subscript member
  • 不允许使用非成员函数重载 C++ 转换运算符的理由是什么

    C 0x 添加了显式转换运算符 但它们必须始终定义为 Source 类的成员 这同样适用于赋值运算符 它必须在 Target 类上定义 当所需转换的 Source 和 Target 类彼此独立时 Source 都不能定义转换运算符 Targ
  • 如何通过IP地址列出网络计算机上所有已安装的软件?

    我想知道如何获取网络计算机上安装的软件列表 我能够获取本地计算机上安装的软件列表 但不确定如何提取网络内计算机上已安装软件的详细信息 我使用服务器名称或网络计算机的 IP 地址作为唯一的输入 下面是从本地计算机获取已安装软件的详细信息的代码