2

我再次需要一些帮助。

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

所以伙计们,有没有可能在后台运行网络命令,用户不应该注意到,当然也看不到包含纯文本密码的命令。

我希望你能明白。

非常感谢
托比

4

3 回答 3

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。请参阅此 列表以了解数字的含义!

于 2010-09-01T07:28:06.427 回答
1

您可以通过 P/Invoking来使用WNetAddConnetion3 (这里是声明)。这里是 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;
    }
于 2010-08-27T14:29:11.183 回答
1

创建一个 Windows 窗体应用程序而不是控制台应用程序,并将program.cs 的 Main 方法中的所有代码替换为

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

于 2010-08-27T07:17:12.197 回答