1

C# Windows アプリケーションを開発しました。OSはWindows7です

要件:WNetAddConnection2クラスを使用した資格情報を含むコードを使用して、ネットワーク共有フォルダー 'Test' にアクセスすることです。

制限:一部のユーザーはこの共有フォルダー「Test」にアクセスできますが、他のユーザーには「拒否」共有権限が設定されています。

コードでWNetAddConnection2間違ったユーザー名/パスワードを検証すると、エラーが発生します。

例えば

LAN から「ユーザー A」が を使用して共有フォルダ「テスト」にアクセスしようとしていますrun commandが、権限がないため、「アクセスが拒否されました」にアクセスできません。

しかし問題は、WNetAddConnection2 クラスにより、「ユーザー A」がネットワーク接続を正常に確立できることです。「WNetAddConnection2 はドメインのすべてのユーザーを許可する」に感染します。クラスはアクセス権を検証しています。

コードは

private void btnValidate_Click(object sender, EventArgs e)
     {
         bool valid = false;
         try
         {              
             NetworkCredential NC = new NetworkCredential(txtUserName.Text.Trim(), txtPassword.Text.Trim());  

         }
         catch (Exception ex)
         {
             MessageBox.Show(ex.Message.ToString());
         }
     }

public class NetworkConnection : IDisposable
 {
     string _networkName;
     uint dwFlags;
     public NetworkConnection(string networkName, NetworkCredential credentials)
     {
         _networkName = networkName;

         var netResource = new NetResource()
         {
             Scope = ResourceScope.GlobalNetwork,
             ResourceType = ResourceType.Disk,
             DisplayType = ResourceDisplaytype.Share,
             RemoteName = networkName
         };

         var userName = string.IsNullOrEmpty(credentials.Domain)
             ? credentials.UserName
             : string.Format(@"{0}\{1}", credentials.Domain, credentials.UserName);

         var result = WNetAddConnection2(netResource,"","",0x00000008 | 0x00000010);

         if (result != 0)
         {
             string strErrMsg = "";
             if (result == 67)
             {
                 strErrMsg = "The network name cannot be found.";
             }
             if (result == 86)
             {
                 strErrMsg = "Invalid UserName or Password for ProBiz server";
             }
             else if (result == 1219)
             {
                 strErrMsg = "Multiple connections to a server or shared resource by the same user, using more than one user name, are not allowed.Close application to Disconnect all previous connections to the server or shared resource and try again.";
             }

             throw new Win32Exception(result, "Error connecting to "+networkName+" remote share.Error Code:"+result.ToString()+"."+strErrMsg);
         }
         else
         {
             MessageBox.Show("Test connection is successful for "+ networkName);
         }
     }

     ~NetworkConnection()
     {
         Dispose(false);
     }

     public void Dispose()
     {
         Dispose(true);
         GC.SuppressFinalize(this);
     }

     protected virtual void Dispose(bool disposing)
     {
         WNetCancelConnection2(_networkName,  1, true  );
         var command = "NET USE  /delete *";
         ExecuteCommand(command, 5000);

     }
     public static int ExecuteCommand(string command, int timeout)
     {
         var processInfo = new ProcessStartInfo("cmd.exe", "/C " + command)
         {
             CreateNoWindow = true,
             UseShellExecute = false,
             WorkingDirectory = "C:\\",
         };

         var process = Process.Start(processInfo);
         process.WaitForExit(timeout);
         var exitCode = process.ExitCode;
         process.Close();
         return exitCode;
     } 

     [DllImport("mpr.dll")]
     private static extern int WNetAddConnection2(NetResource netResource,
         string password, string username, int flags);

     [DllImport("mpr.dll")]
     private static extern int WNetCancelConnection2(string name, int flags,
         bool force);
 }

 [StructLayout(LayoutKind.Sequential)]
 public class NetResource
 {
     public ResourceScope Scope;
     public ResourceType ResourceType;
     public ResourceDisplaytype DisplayType;
     public int Usage;
     public string LocalName;
     public string RemoteName;
     public string Comment;
     public string Provider;
 }

 public enum ResourceScope : int
 {
     Connected = 1,
     GlobalNetwork,
     Remembered,
     Recent,
     Context
 };

 public enum ResourceType : int
 {
     Any = 0,
     Disk = 1,
     Print = 2,
     Reserved = 8,
 }

 public enum ResourceDisplaytype : int
 {
     Generic = 0x0,
     Domain = 0x01,
     Server = 0x02,
     Share = 0x03,
     File = 0x04,
     Group = 0x05,
     Network = 0x06,
     Root = 0x07,
     Shareadmin = 0x08,
     Directory = 0x09,
     Tree = 0x0a,
     Ndscontainer = 0x0b
 }
4

2 に答える 2

0

設計上、共有への接続には共有へアクセスが必要です。共有のルート ディレクトリへのアクセスは必要ありません。

[実行] ボックスを使用して共有を開くと、共有のルート ディレクトリが開きます。そのため、少なくともディレクトリと共有への読み取りアクセスが必要です。これに対して、WNetAddConnection2() API は、共有へのアクセスのみを必要とします。

ルートディレクトリではなく、特定のサブディレクトリのみへのアクセスを誰かに与えることが望ましい場合があるため、このように動作する必要があります。共有への接続にルート ディレクトリへのアクセスが必要な場合、これは不可能です。

共有に接続した後、ファイルを列挙してルート ディレクトリへのアクセスをテストできます。アクセス拒否の例外が発生した場合、ユーザーにはアクセス権がありません。

于 2015-09-03T21:32:22.990 に答える
-3

C# プロジェクトを IIS 7.5 に展開したときに同じ問題が発生しましたが、コードのログアウト手順を削除すると驚くべきことになります。. .

私が意味するのは、機能LogoutFromShare(ip,folder)サーバーディレクトリが削除されたことです。

私はこれを 1 つ使用しますLoginToOtherPC(ip, usr, pwd, folder)

于 2015-09-03T08:07:18.760 に答える