-1

Пытаюсь получить текущего работающего пользователя, через WMI. Но происходит не понятная мне ошибка. Метод не должен возвращать null, но он это делает.

вот сам метод

public static async Task<object> GetCurrentUser(object ipAddress)
{
    return await Task.Run(() =>
    {
        try
        {
            ManagementScope scope = new ManagementScope("\\\\" + ipAddress + "\\root\\cimv2");
            scope.Connect();

            ObjectQuery query = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

            ManagementObjectCollection queryCollection = searcher.Get();
            foreach (ManagementObject m in queryCollection)
            {
                return m["username"];
            }
            return "0";
        }
        catch (Exception)
        {

            return "0";
        }


    });
}

Ошибка возникает следующая

введите сюда описание изображения

Вот как я вызываю этот метод.

Parallel.ForEach(ping_success_ips, opts, ip =>
{
    Computer computer = new Computer
    {
        Status = true,
        Os = WMI.GetOs(ip).GetAwaiter().GetResult().ToString(),
        Mac = WMI.GetMacAddress(ip),
        IP = ip,
        Hostname = WMI.GetHostName(ip).GetAwaiter().GetResult().ToString(),
        ONTime = DateTime.Now
    };
    User user = new User
    {
        ComputerId = computer.Id,
        Username = WMI.GetCurrentUser(ip).GetAwaiter().GetResult().ToString(),
        Ontime = DateTime.Now
    };

    lock (computer)
    {
        lock (user)
        {
            using (var appContext = new LanScannerModel())
            {
                appContext.Computers.Add(computer);
                appContext.Users.Add(user);
                appContext.SaveChanges();
            }
        }
    }

    Console.WriteLine(computer.IP + "   "+ computer.Mac + " " + computer.Os + " " + computer.Hostname);
});

Возможно это происходит из-за асинхронности метода и он не успевает выполнить запрос и возвращает null. Не могу понять, почему это происходит?

Pavel Mayorov
  • 58,537
shatoidil
  • 1,492
  • Встречная загадка. Какая из трех строчек: return m["username"];, return "0"; и return "0"; может вернуть null? – Pavel Mayorov Oct 26 '17 at 10:44
  • 1
    Кстати, вы читали описания используемых вами меток? – Pavel Mayorov Oct 26 '17 at 10:44
  • @pavel-mayorov Какие метки имеются в виду? return m["username"] тоже стоит try, но все равно кидает Null – shatoidil Oct 27 '17 at 08:52
  • а какая связь между null и try? – Pavel Mayorov Oct 27 '17 at 08:55
  • @pavel-mayorov Все варианты испробовал не получается у меня.Подскажи как, пожалуйста. – shatoidil Oct 27 '17 at 09:06
  • Что return m["username"]; возвращает? – Denis Oct 27 '17 at 09:08
  • @pavel-mayorov Думаю return m["username"] и возвращает null? Но проверка не спасет. ManagementObject она возвращает, ну я попробовал ToString(), но все равно в ошибку бросает. Да и тут WMI.GetCurrentUser(ip).GetAwaiter().GetResult().ToString() тоже должно переганться в ToString(). Не могу понять почему – shatoidil Oct 27 '17 at 09:12
  • 1
    @shatoidil почему вы думаете что вызов ToString может перегнать null в строку? – Pavel Mayorov Oct 27 '17 at 09:29

1 Answers1

1
Username = WMI.GetCurrentUser(ip).GetAwaiter().GetResult()?.ToString(). 

Try ловит объекты класса Exception и производные от него. Здесь нужно реагировать на null внутри таска и возвращать уже желаемый результат. Либо подставлять пустую строку вместо null, код выше. ToString() бросает исключение при попытке кастить null в стринг

Denis
  • 178