Как запустить консольную команду msinfo32 из C #? - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы сделать отчет из команды msinfo32 в файл nfo в папке рабочего стола пользователя.Я запускаю этот exe-файл напрямую, потому что команда msinfo32 иногда отсутствует в PATH XP.Итак, это то, что я хотел бы от C #:

"C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe" /nfo C:\Users\someUser\Desktop\my_pc.nfo

У меня есть этот код сейчас, он вызывает UAC, а затем окно cmd закрывается.Файл не создан.Почему это не работает?

        var proc1 = new ProcessStartInfo();

        string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string myFile = "my_pc.nfo";
        string myFullPath = Path.Combine(desktopPath, myFile);
        string myCommand = @"/C C:\Program Files\Common Files\Microsoft Shared\MSInfo\msinfo32.exe /nfo " + myFullPath;

        proc1.UseShellExecute = true;
        proc1.WorkingDirectory = @"C:\Windows\System32";
        proc1.FileName = @"C:\Windows\System32\cmd.exe";
        proc1.Verb = "runas";

        char quote = '"';
        proc1.Arguments = "/C " + quote + myCommand + quote;
        proc1.WindowStyle = ProcessWindowStyle.Normal;
        Process.Start(proc1);

        Console.ReadLine();

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

По предложению @ CatCat мне удалось запустить эту программу от имени администратора.Вы захотите изменить манифест, встроенный в программу.Это работает в Visual Studio 2008 и более поздних версиях: Project + Add New Item, выберите «Файл манифеста приложения».Измените элемент <requestedExecutionLevel> на:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Пользователь получает приглашение UAC при запуске программы.Я связал Enviroment.SpecialFolder.Desktop с другими моими параметрами в arugment процесса, и теперь это работает, как я хотел.

using System;
using System.Diagnostics;
using System.ServiceProcess;

namespace WinTImeSync
{
    class Program
    {
        static void Main(string[] args)
        {
            if (MsInfoReport() == true)
            {
                Console.WriteLine("Command ran successfully.");
            }
            else
            {
                Console.WriteLine("Did not run.");
            }
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }

        public static bool MsInfoReport()
        {
            try
            {
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                Process processTime = new Process();
                processTime.StartInfo.FileName = @"C:\Program Files\Common Files\microsoft shared\MSInfo\msinfo32.exe";
                processTime.StartInfo.Arguments = "/report " + desktopPath + "\\mypc_info.nfo /categories +systemsummary";
                processTime.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                processTime.Start();
                processTime.WaitForExit();

                return true;
            }
            catch (Exception exception)
            {
                Trace.TraceWarning("unable to run msinfo32", exception);
                return false;
            }
        }
    }
}
0 голосов
/ 20 сентября 2018

NB : MSInfo не устанавливает уровень ошибки.

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

По совершенно неизвестной причине вы звоните в CMD, даже если не хотите, чтобы он что-либо делал.

Вы используете неподдерживаемый способчтобы поднять, это работает, только если конфигурация ассоциации файлов exe не была изменена.Вы используете манифест для поднятия.См. Запуск пакетного скрипта от имени администратора во время сборки Maven

Также смотрите wmi, как должна делать программа.Вы можете поэкспериментировать с инструментом командной строки wmic.Программы для пользователей, а не другие программы.

Это ищет сети Wi-Fi

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From WiFi_AvailableNetwork")
'msgbox colitems
For Each objItem in colItems
    msgbox objItem.name & " " & objItem.Description
Next

Этот список услуг,

Set objWMIService = GetObject("winmgmts:\\127.0.0.1\root\cimv2")

Set config = objWMIService.ExecQuery("Select * From Win32_Service")
For Each thing in Config
        Msgbox thing.Caption
Next

Мониторы

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Set colItems = objWMIService.ExecQuery("Select * From Win32_DesktopMonitor")

For Each objItem in colItems
    msgbox  objItem.Model & " " & objItem.Manufacturer & " " & objItem.SerialNumber
Next

Ожидается, когда произойдут энергетические события, и либо убивает, либо запускает калькулятор.

Set colMonitoredEvents = GetObject("winmgmts:")._
    ExecNotificationQuery("SELECT * FROM Win32_PowerManagementEvent")
Do
    Set strLatestEvent = colMonitoredEvents.NextEvent
    If strLatestEvent.EventType = 4 Then 
        Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
        Set colItems = objWMIService.ExecQuery("Select * From Win32_Process")
        For Each objItem in colItems
            If objItem.name = "Calculator.exe" then objItem.terminate
        Next
    ElseIf strLatestEvent.EventType = 7 Then 
        wscript.sleep 2000
        Set WshShell = WScript.CreateObject("WScript.Shell")
        WshShell.Run "calc.exe", 1, false
    End If
Loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...