0

マップされたネットワーク ドライブと対話するサード パーティのプロセスを実行する必要がある Web サービスに取り組んでいます。したがって、このドライブを Web サービスからプログラムでマップする必要があります。

私はすでに WNetAddConnection2 などを別のプロジェクトのより適切なクラスにラップしているので、コードをそのまま挿入しました。

私たちの Web サービスは、System アカウントで実行される (IIS ではなく) UltiDev Cassini で実行されています。毎回、「指定されたデバイス名が無効です」というエラー コードが表示されます。また、web.config ファイルで他のユーザーになりすまそうとしましたが、結果は同じでした。

通常のユーザー アカウントでコンソール プログラムからコードを実行すると、ドライブは正常にマップされます。

また、C# から同等の「net use」コマンドを実行してみましたが、WNetAddConnection とまったく同じ結果が得られました。

Windows サービスまたはシステム ユーザーがネットワーク ドライブをマップできない理由を知っている人はいますか?

誰かが回避策を知っていますか? システムの起動時にドライブをマッピングするだけで解決できますが、システム/偽装ユーザーはどのようにアクセスできますか?

UltiDev Cassini へのリンク: UltiDev

解決策: UltiDev Cassini サービスを管理者としてログオンするように設定し、すべてが機能しています。ASP .Net 偽装は、計画どおりに機能してはなりません。

4

6 に答える 6

2

LOCAL_SYSTEM アカウントは、ネットワーク上で匿名の資格情報を提示します。匿名 (全員) が共有にアクセスできる場合は、UNC ネットワーク共有を使用してこの情報にアクセスできます。

別のユーザーで実行するように構成できるWindows サービスとして Cassini をインストールすることもできます。

于 2009-09-16T13:52:00.947 に答える
2

Local System アカウントを使用している場合、ネットワーク [foo] へのアクセスは本質的に不可能だと思います。なりすましが唯一の実行可能な方法だと思います。技術的には、共有へのアクセス制御を誰でも読み取り/書き込みできるように減らすことができますが、それは解決策よりも多くの問題をもたらします。

于 2009-09-16T13:32:03.773 に答える
1

同じ問題がありました。この問題は、コードが実行されているアカウントが原因で発生します。次のクラスを使用して、これを回避できます。ファイルへのアクセス/コピーに使用しているのと同じコードでドライブをマップする必要があります。私たちが使用するパターンは、ドライブが最初に接続されているかどうかを常に確認することです。その場合は、切断してから再接続します。そうでない場合は、接続するだけです。あなたが説明している問題を解決しているようです。

public static class NetworkDrives
    {
        public static bool  MapDrive(string DriveLetter, string Path, string Username, string Password)
        {

            bool ReturnValue = false;

            if(System.IO.Directory.Exists(DriveLetter + ":\\"))
            {
                DisconnectDrive(DriveLetter);
            }
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": " + '"' + Path + '"' + " " + Password + " /user:" + Username;
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }
        public static bool DisconnectDrive(string DriveLetter)
        {
            bool ReturnValue = false;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.RedirectStandardOutput = true;

            p.StartInfo.FileName = "net.exe";
            p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE";
            p.Start();
            p.WaitForExit();

            string ErrorMessage = p.StandardError.ReadToEnd();
            string OuputMessage = p.StandardOutput.ReadToEnd();
            if (ErrorMessage.Length > 0)
            {
                throw new Exception("Error:" + ErrorMessage);
            }
            else
            {
                ReturnValue = true;
            }
            return ReturnValue;
        }

    }
于 2009-09-16T13:48:49.963 に答える
0

マップされたドライブの代わりに、UNC 共有を使用して接続できますか?

共有にアクセスできるユーザーになりすますことはできます。

于 2009-09-16T13:50:15.450 に答える
0

私は実際にこれを以前に行ったことがありますが、それは非常に昔のことです - 1997年、Delphi 2でWin NT 3.51のように

私はメモリから実行していますが、次のようになると思います: Win API を使用します。

WNetAddConnection2()

電話に関する情報: http://msdn.microsoft.com/en-us/library/aa385413(VS.85).aspx

pInvoke.net から c# 署名を取得できます: http://www.pinvoke.net/default.aspx/mpr/WNetAddConnection2.html

構成に関する注意: サービスのドメイン アカウントを設定し、ローカル システムではなくそのアカウントの ID でサービスを実行する必要があると思います。ユーザー名とパスワードに null を渡していると思います。

ローカル システムがドメイン アカウントのユーザー名とパスワードを渡すときにサービスを実行できる可能性があります。システム アカウントにネットワーク アクセスが許可されているかどうかはわかりません。

于 2009-09-16T14:02:32.760 に答える