Запустите программу командной строки тихо с C # на Wince - PullRequest
2 голосов
/ 27 августа 2010

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

Я использую .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, но он не существует в компактной среде.

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

Я надеюсь, вы поняли идею.

Большое спасибо заранее
Toby

Ответы [ 3 ]

3 голосов
/ 01 сентября 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. Обратитесь к этому списку , чтобы понять, что означают цифры!

1 голос
/ 27 августа 2010

Вы можете использовать WNetAddConnetion3 с помощью P / Invoking ( здесь объявление). Вот объявление для структуры 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;
    }
1 голос
/ 27 августа 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

...