#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 секунд или больше