1

공유 네트워크 경로로 파일을 복사하는 프로젝트가 있습니다. 내 응용 프로그램이이 경로에 대해 인증하면 사용자는 파일 탐색기로이 폴더에 액세스 할 수 있습니다. 어떻게 사용자가 사용자 이름과 암호를 묻지 않고 파일 탐색기로이 경로에 액세스 할 수 없게 할 수 있습니까? NetworkCredential 클래스를 사용하여 인증하고 있습니다.Windows 액세스 권한이없는 공유 폴더에 액세스

class Program 
{ 
    static void Main(string[] args) { 

     string path = @""; 
     string username = ""; 
     string password = ""; 


     try { 
      using (NetworkConnection nc = new NetworkConnection(path, new NetworkCredential(username, password))) { 
       Console.WriteLine("Connected successfully..."); 

       //copy files here ........ 
      } 
     } catch (Exception ex) { 
      Console.WriteLine(ex.Message); 
     } 

     Console.Read(); 
    } 
} 

public class NetworkConnection : IDisposable 
{ 
    string _networkName; 

    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, 
      credentials.Password, 
      userName, 
      0); 

     if (result != 0) { 
      throw new Exception("Error connecting to remote share"); 
     } 
    } 

    ~NetworkConnection() { 
     Dispose(false); 
    } 

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

    protected virtual void Dispose(bool disposing) { 
     WNetCancelConnection2(_networkName, 0, true); 
    } 

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

답변

1

당신은 WNetAddConnection2 함수의 마지막 인수로 연결 옵션을 설정할 수 있습니다

내 코드입니다. 이 예제는 사용자에게 로그인을 요구합니다.

0x00000008

var result = WNetAddConnection2(
      netResource, 
      credentials.Password, 
      userName, 
      0x00000008 | 0x00000010); 
=이 플래그가 설정되면, 운영 시스템은 인증을 위해 사용자와 상호 작용할 수있다.

0x00000010 =이 플래그는 시스템에 사용자 이름이나 암호에 대한 기본 설정을 사용하지 말고 사용자에게 대안을 제공 할 기회를주지 않도록 지시합니다. CONNECT_INTERACTIVE도 설정하지 않으면이 플래그는 무시됩니다.

이 플래그는 응용 프로그램이 다른 사용자와 함께 실행되는 경우에도 사용할 수 있습니다.

0x00000004 = 네트워크 리소스 연결을 기억해서는 안됩니다. 이 플래그가 설정되면 운영 체제는 사용자가 다시 로그온 할 때 연결 복원을 시도하지 않습니다. 이 플래그를 설정하면 그 플래그

0x00002000

= 및 운영 체제와

또는 이들의 조합은 자격 증명은 자격 증명 관리자에 의해 리셋, 자격 증명에 대해 묻는 메시지를 표시합니다. CONNECT_COMMANDLINE 플래그를 설정하지 않는 한이 플래그는 무시됩니다.

0x00000800 =이 플래그가 설정되면 운영 체제는 그래픽 사용자 인터페이스 (GUI) 대신 명령 줄을 사용하여 사용자에게 인증을 요청합니다. CONNECT_INTERACTIVE도 설정하지 않으면이 플래그는 무시됩니다.