我再次需要一些帮助。
我正在使用.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,用户不应该注意到,当然也看不到包含密码的命令。
我希望你明白这个主意。
非常感谢提前 托比
答案 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它来使用WNetAddConnetion3(here 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;
}