2

もう一度助けが必要です。

WinCE 5.0を実行しているモバイルデバイス用に開発するために、.net Compact Frameworkとプログラミング言語C#を使用しています。

私が達成したいのは、プログラムでネットワークドライブをマウントすることです。そのために、アプリはバックグラウンドスレッドで次のコードを実行します。

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を実行する可能性はありますか?ユーザーは、パスワードを含むコマンドに気付かないはずであり、プレーンテキストで表示されないはずです。

私はあなたがその考えを理解することを望みます。

よろしくお願いし
ますToby

4

3 に答える 3

3

シャイヒありがとうございます、あなたは私を正しい軌道に乗せてくれました。

あなたが提供したコードとリンクは、私にとってうまく機能する次の解決策に私を最終的に導きました:

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

2つのWNET関数呼び出しは整数値を返します。この値が0の場合、操作は正常に終了しました。私が経験した一般的なコードは53と85 です。数字の意味の手がかりを得るためにこのリストを参照してください!

于 2010-09-01T07:28:06.427 に答える
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 に答える
1

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;
    }
于 2010-08-27T14:29:11.183 に答える