在wince上使用c#静默运行命令行程序

时间:2010-08-27 07:05:58

标签: c# .net compact-framework windows-ce shellexecute

我再次需要一些帮助。

我正在使用.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',但它在紧凑框架中不存在。

所以大家,是否有可能在后台运行net-commands,用户不应该注意到,当然也看不到包含密码的命令。

我希望你明白这个主意。

非常感谢提前 托比

3 个答案:

答案 0 :(得分:3)

非常感谢Shaihi, 你让我走上正轨。

您提供的代码和链接最终让我得到了以下适用于我的解决方案:

[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.请参阅此list以了解数字的含义!

答案 1 :(得分:1)

使用

在program.cs的Main方法中创建Windows窗体应用程序而不是控制台应用程序替换所有代码
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

答案 2 :(得分:1)

您可以通过P / Invoking它来使用WNetAddConnetion3here is声明)。这是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;
    }