получение переменных среды с удаленного компьютера происходит очень медленно

#c# #.net #winapi

#c# #.net #winapi

Вопрос:

Я использую следующий код для получения переменных среды с удаленного компьютера

проблема в том, что выполнение кода занимает очень много времени.

     DataTable envVarliables = new DataTable();
            envVarliables.Columns.Add("UserName");
            envVarliables.Columns.Add("VarName");
            envVarliables.Columns.Add("VarValue");

            ManagementObjectSearcher query = null;
            ManagementObjectCollection queryCollection = null;

            ConnectionOptions opt = new ConnectionOptions();

            opt.Impersonation = ImpersonationLevel.Impersonate;
            opt.EnablePrivileges = true;

            opt.Username = @"domainuser";
            opt.Password = @"password";
            try
            {
                ManagementPath p = new ManagementPath(@"\servername"   "\root\cimv2");

                ManagementScope msc = new ManagementScope(p, opt);

                SelectQuery q = new SelectQuery("select * from Win32_Environment where Name='IBMSENV' ");

                query = new ManagementObjectSearcher(msc, q, null);
                queryCollection = query.Get();

                //Console.WriteLine(queryCollection.Count);
                List<string> temp = new List<string>();

                  foreach (ManagementBaseObject envVar in queryCollection)
                    {
                        if (envVar["Name"].ToString() == "MYENVVARNAME")
                        {
                            envVarliables.Rows.Add(envVar["UserName"].ToString(), envVar["Name"].ToString(),
                            envVar["VariableValue"].ToString());
                        }
envVar["VariableValue"].ToString());
                        //temp.Add(envVar["Name"].ToString());
                    }
                return envVarliables;
  

Моя проблема заключается в строке foreach (ManagementBaseObject envVar in queryCollection)
, выполнение которой при первом достижении этой строки занимает от 30 секунд до 1,5 минут или даже больше.

После этого цикл выполняется очень быстро.

Вопрос в том, могу ли я что-то улучшить, чтобы заставить его работать быстрее?

Другой вопрос, есть ли другой способ получить данные с удаленного компьютера? Например, для получения других данных с удаленного компьютера я использовал https://code.google.com/p/cassia / но у него нет методов для извлечения переменных среды

Комментарии:

1. Я видел это раньше или что-то очень похожее. Попробуйте включить исключение «Удаленное управление службами (RPC)» в брандмауэре на удаленном компьютере.

2. попросит ЕГО сделать это, спасибо

3. @HarryJohnston — Привет, попробовал то, что вы предложили, но это не помогло: (

4. Я думаю, это может быть другой порт. Попробуйте использовать netstat во время начальной задержки, чтобы узнать, пытается ли клиент подключиться и блокируется ли брандмауэром; ищите состояние SYN_SENT .

5. @HarryJohnston я не уверен, что это проблема с портом. Сам запрос выполняется на удаленном компьютере в этой строке «queryCollection = query.Get();» Эта строка выполняется менее чем за секунду. Первый раз, когда он пытается запустить элементы в этой строке «foreach (ManagementBaseObject envVar в queryCollection)», занимает 30 секунд или больше