none
список процессов запущеных пользователем RRS feed

  • Вопрос

  • Добрый день,

    Никак не могу решить задачу, необходимо выяснить, запущено ли приложение 1cv8 у определенного пользователя на сервере терминалов. Алгоритм следующий:

    1. Получаем имя пользователя

    2. Получаем код сеанса пользователя (LogonID)

    3. Получаем список всех процессов с именем "1cv8"

    4. Ищем в полученном списке процесс с SessionID = LogonID

    Проблема в пункте 2, штатными средствами C# код сеанса получить не могу (не нашел такой возможности). Попытался получить код с помощью утилиты query session

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "C:\\Windows\\System32\\query.exe";
    p.Start();
    string output = p.StandardOutput.ReadToEnd();
    p.WaitForExit();

    получаю ошибку "файл не найден", уже всю голову сломал, файл точно есть из cmd все работает замечательно, перепроверил много раз. Если вместо query.exe поставить ping.exe все работает, а query.exe нет. Может я чего то не до понимаю?

    P.S. Может есть другой способ решения задачи, а то я чувствую городить начал уже много



    6 апреля 2013 г. 12:23

Ответы

Все ответы

  • В вашем варианте у меня все запускается. Если добавляю аргументы в строку (к примеру session), то возникает описанная ошибка. Сделал следующим образом - все работает:

                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "C:\\Windows\\System32\\query.exe";
                p.StartInfo.Arguments = "session";
                p.Start();
                Console.WriteLine(p.StandardOutput.ReadToEnd());
                p.WaitForExit();
    

    • Помечено в качестве ответа Rinat Moustafin 7 апреля 2013 г. 6:30
    • Снята пометка об ответе Rinat Moustafin 7 апреля 2013 г. 6:30
    • Помечено в качестве ответа Rinat Moustafin 7 апреля 2013 г. 6:31
    • Снята пометка об ответе Rinat Moustafin 8 апреля 2013 г. 10:31
    6 апреля 2013 г. 22:39
  • В вашем варианте у меня все запускается. Если добавляю аргументы в строку (к примеру session), то возникает описанная ошибка. Сделал следующим образом - все работает:

                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "C:\\Windows\\System32\\query.exe";
                p.StartInfo.Arguments = "session";
                p.Start();
                Console.WriteLine(p.StandardOutput.ReadToEnd());
                p.WaitForExit();
    

    Перепроверил несколько раз, ваш код тоже не работает, все та же ошибка. Пытаюсь разобраться в чем дело
    8 апреля 2013 г. 10:32
  • Вы можете привести ваш полный код (если он конечно не сильно большой) и более точное описание ошибки (в какой строке, полное сообщение, если есть вложенные ошибки)?
    8 апреля 2013 г. 10:39
  • Вы можете привести ваш полный код (если он конечно не сильно большой) и более точное описание ошибки (в какой строке, полное сообщение, если есть вложенные ошибки)?


    8 апреля 2013 г. 11:24
  • А если запустить приложение от админа?
    8 апреля 2013 г. 11:36
  • У вас приложение действительно с расширением exe или называется просто query? Для верности, попробуйте вызывать не query.exe, а просто query.
    8 апреля 2013 г. 11:40
    Отвечающий
  • У вас приложение действительно с расширением exe или называется просто query? Для верности, попробуйте вызывать не query.exe, а просто query.

    query.exe Поменял код на

    Process p = new Process();
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.FileName = "C:\\Windows\\System32\\query";
    p.StartInfo.Arguments = "session";
    p.Start();
    Console.WriteLine(p.StandardOutput.ReadToEnd());
    p.WaitForExit();

    все равно не работает. Сейчас попробую на другой машине
    8 апреля 2013 г. 12:02
  • А если запустить приложение от админа?
    Пробовал. Отключил UAC, DEP, антивирус. Ничего не помогает. На другом ПК работает. Копаю дальше
    8 апреля 2013 г. 12:18
  • В общем судя по этой записи, отловленной Process Monitor

    16:11:14,6135819 ConsoleApplication1.exe 1272 CreateFile C:\Windows\SysWOW64\query.exe NAME NOT FOUND Desired Access: Read Attributes, Dis, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a
    

    программа пытается запустить утилиту из папки SysWOW64, т.е. игнорирует полный путь указанный в программе. Почему? Скопировал руками утилиту в папку SysWOW64. Заработало!

    8 апреля 2013 г. 12:27
  • А что вам возвращает функция Environment.SystemDirectory?
    8 апреля 2013 г. 13:00
  • А что вам возвращает функция Environment.SystemDirectory?

    C:\Windows\system32
    8 апреля 2013 г. 13:31
  • А если скрестить это дело:

                Process p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.WorkingDirectory = Environment.SystemDirectory;
                p.StartInfo.FileName = Path.Combine(Environment.SystemDirectory, "query.exe");
                p.StartInfo.Arguments = "session";
                p.Start();
                Console.WriteLine(p.StandardOutput.ReadToEnd());
                p.WaitForExit();
                Console.ReadKey();
    

    8 апреля 2013 г. 13:50
  • Не работает, та же ошибка

    8 апреля 2013 г. 13:55
  • В свойствах проекта, Build, снимите чекбокс Prefer 32-bit.
    8 апреля 2013 г. 14:04
    Модератор
  • В свойствах проекта, Build, снимите чекбокс Prefer 32-bit.

    Извините, забыл сказать что у меня 2010 студия, там вроде такого крыжыка нет
    8 апреля 2013 г. 14:37
  • Тогда поменяйте Target Platform с x86 на AnyCPU.
    • Помечено в качестве ответа Rinat Moustafin 8 апреля 2013 г. 16:44
    8 апреля 2013 г. 14:37
    Модератор
  • Тогда поменяйте Target Platform с x86 на AnyCPU.

    Да, это помогло. Только я не понял логику подобного поведения, объясните если не трудно.
    8 апреля 2013 г. 16:39
  • 32-х битное приложение на 64-битной платформой работает под WOW64. Т.е. для него срабатывает File System Redirector, который перенаправляет все запросы из %windir%\System32 в %windir%\SysWOW64.
    • Помечено в качестве ответа Rinat Moustafin 8 апреля 2013 г. 19:28
    8 апреля 2013 г. 17:11
    Модератор