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

问题描述:

我再次需要一些帮助。用c#在wince上默默运行命令行程序

我使用.net精简框架和编程语言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,用户不应该注意到,当然也不会看到命令,包括纯文本的密码。

我希望你明白。

提前感谢
托比

您可以使用WNetAddConnetion3 by P/Invoking it(here is声明)。这里是NetR的声明esource结构:

[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; 
    } 

创建一个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); 

替换所有的代码在Program.cs中的Main方法Form1.cs中删除

+0

好吧,这个代码被调用的应用程序是一个WinForm应用程序! – Toby 2010-08-27 07:39:07

+0

如果我想在不显示窗口和管理员模式的情况下从命令提示符打开应用程序,该怎么办? – SearchForKnowledge 2015-02-20 17:19:42

非常感谢你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来得知数字的意思!