Запустите программу командной строки без вывода сообщений с помощью С# на wince

Мне снова нужна помощь.

Я использую .net Compact Framework и язык программирования C# для разработки мобильных устройств под управлением WinCE 5.0.

Чего я хочу добиться, так это программно смонтировать сетевой диск. Для этого приложение запускает следующий код в фоновом потоке:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "net";
startInfo.UseShellExecute = false;
startInfo.Arguments = @"use logs \\server\logs /user:dom\uname /password:pw";
Process p = Process.Start(startInfo);
p.WaitForExit(5000);

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

Параметр «UseShellExecute», похоже, не дает никакого эффекта.

Я читал о параметре CreateNoWindow, но его нет в компактной среде.

Итак, ребята, есть ли возможность запускать сетевые команды в фоновом режиме, пользователь не должен замечать и, конечно, не видеть команду, включая пароль в виде простого текста.

Надеюсь, вы уловили идею.

Заранее большое спасибо
Тоби


person Toby    schedule 27.08.2010    source источник


Ответы (3)


Вы можете использовать WNetAddConnetion3, вызвав его P/(вот объявление). Вот объявление для структуры NetResource:

    [StructLayout(LayoutKind.Sequential)]
    internal struct NetResource
    {
        public uint dwScope;
        public uint dwType;
        public uint dwDisplayType;
        public uint dwUsage;
        [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        public string lpLocalName;
        [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        public string lpRemoteName;
        [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        public string lpComment;
        [MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
        public string lpProvider;
    }
person Shaihi    schedule 27.08.2010

Большое спасибо, Шайхи, вы наставили меня на правильный путь.

Код и ссылки, которые вы предоставили, наконец привели меня к следующему решению, которое отлично работает для меня:

[DllImport("coredll.dll")]
    private static extern int WNetAddConnection3(IntPtr hWndOwner,
    ref NetResource lpNetResource, string lpPassword, string lpUserName, int dwFlags);

 [DllImport("coredll.dll")]
    static extern int WNetCancelConnection2(string lpName, Int32 dwFlags, bool bForce);
...
try
{

   NetResource logsResource = new NetResource();
   logsResource.lpLocalName = "logs";
   logsResource.lpRemoteName = @"\\server\logs";
   logsResource.dwType = 0x1; //const int RESOURCETYPE_DISK = 0x1
   logsResource.dwScope = 0;
   logsResource.dwUsage = 0;
   logsResource.dwDisplayType = 0;

   //try to connect the network resource
   WNetAddConnection3(new IntPtr(0), ref logsResource, @"pass", @"dom\user", 0);

   //copy files to the server
   string[] logfiles = Directory.GetFiles(@"\System\Logs\");
   foreach (string logfile in logfiles)
   {
       File.Copy(logfile, @"\network\logs\" + 
                 logfile.Substring(logfile.LastIndexOf(@"\") + 1), true);
   }
}
catch
{
}
finally
{
    //try to disconnect network resource
    WNetCancelConnection2("logs", 0, false);
}

Два вызова функции WNET возвращают целочисленное значение. Если это значение равно 0, операция завершена успешно. Распространенные коды, с которыми я сталкивался: 53 и 85. Обратитесь к этому списку, чтобы получить подскажите что означают цифры!

person Toby    schedule 01.09.2010

Создайте приложение Windows Form вместо консольного приложения и замените весь код в методе Main файла program.cs на

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = "net"; 
startInfo.UseShellExecute = false; 
startInfo.Arguments = @"use logs \\server\logs /user:dom\uname /password:pw"; 
Process p = Process.Start(startInfo); 
p.WaitForExit(5000); 

Удалить Form1.cs

person Faisal    schedule 27.08.2010
comment
Что ж, приложение, из которого вызывается этот код, является приложением WinForm! - person Toby; 27.08.2010
comment
Что, если я хочу открыть приложение из командной строки без отображения окна и в режиме администратора? - person SearchForKnowledge; 20.02.2015