Как удаленно получить инфу о доменной машине?

111
01 октября 2019, 09:30

подскажите пожалуйста есть ли в C# возможность находясь в учетке обычного доменного пользователя получить информацию об установленном ПО и информацию о железе на другой доменной машине?

Answer 1

На тех машинах, к которым вы хотите осуществлять удаленный доступ, необходимо:

  • убедиться, что включена служба удаленного реестра

  • добавить в список разрешений ключа реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurePipeServers\winreg группу "Пользователи домена", и установить галку "Разрешить" напротив пункта "Чтение".

После этого, вы можете получить доступ к любой информации из реестра удаленной машины из-под любой учетной записи домена. Например, список программ, установленных глобально (для всех пользователей компьютера) можно вывести так:

using System;
using Microsoft.Win32;
namespace ConsoleApp1
{    
    class Program
    {  
        public static void Main(string[] argv)
        {
            RegistryKey remote = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "\\\\compname");
            using (remote)
            {
                RegistryKey subkeyUninstall = remote.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
                using (subkeyUninstall)
                {
                    foreach (var subkey_name in subkeyUninstall.GetSubKeyNames())
                    {
                        RegistryKey subkeyApp = subkeyUninstall.OpenSubKey(subkey_name);
                        using (subkeyApp)
                        {
                            object dispname = subkeyApp.GetValue("DisplayName");
                            if (!String.IsNullOrEmpty(dispname as string)) Console.WriteLine(dispname as string);
                            else Console.WriteLine(subkey_name);
                        }
                    }
                }
            }
            Console.ReadKey();
        }    
    }    
}

Безопасность такого решения, впрочем, под серьезным вопросом, так как доступ придется открывать ко всему реестру. Существует групповая политика для разрешения доступа на уровне отдельных ключей, но она, насколько я понял, не позволяет дать доступ только на чтение, так что это еще хуже.

Answer 2

Можно сделать так:

  1. Пишем программу, которая ходит по компьютерам в сети и через WMI, либо реестр и собирает информацию о машинах и записывает в какой-нибудь txt-файл. 1 машина-1 файл.
  2. На какой-нибудь 1 машине настраиваем планировщик задач, что бы он запускал программу из под высокопревелигированной учетки и время от времени перезаписывал(актуализировал) данные.

В итоге получается, что программа запускается по расписанию и кладет данные на общую шару и любой пользователь обладающий доступ на чтение, может открыть необходимый TXT и увидеть нужную информацию.

И проблем с безопасностью никаких не будет.

Ну это самый простой вариант. Решение "по взрослому"- это написать сервис к которому будут обращаться пользователи. А сам сервис будет иметь админские права и делать то, что я описал в первых пунктах.

READ ALSO
Учёт регистра значений при поиске с помощью linq выражений c#

Учёт регистра значений при поиске с помощью linq выражений c#

Есть Модель ClientТуда записывается вся контактная информация о клиенте

156
Как обернуть запрос xacml XML

Как обернуть запрос xacml XML

Есть шаблон запроса

155
Серверное приложение Google Drive Api C#

Серверное приложение Google Drive Api C#

Хочу разработать клиент-серверное приложение для того, чтобы клиенты могли скачивать файлы

138
Универсальный метод парсинга Json

Универсальный метод парсинга Json

Есть некий апи сервис который отдает Json объекты

127