2011-12-21 80 views
0

我試圖訪問需要身份驗證的samba共享。我不希望驅動器被映射。訪問Samba共享,無驅動器映射,IP地址 - C#

我目前已經與samba共享主機名向DNS註冊。它不適用於普通的IP地址。

我已經做了一些工作輪,使其在平均工作時間(加入hosts文件窗口)

這是我使用下面的代碼:

public class PinvokeWindowsNetworking 
{ 
    #region Consts 
    const int RESOURCE_CONNECTED = 0x00000001; 
    const int RESOURCE_GLOBALNET = 0x00000002; 
    const int RESOURCE_REMEMBERED = 0x00000003; 

    const int RESOURCETYPE_ANY = 0x00000000; 
    const int RESOURCETYPE_DISK = 0x00000001; 
    const int RESOURCETYPE_PRINT = 0x00000002; 

    const int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000; 
    const int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001; 
    const int RESOURCEDISPLAYTYPE_SERVER = 0x00000002; 
    const int RESOURCEDISPLAYTYPE_SHARE = 0x00000003; 
    const int RESOURCEDISPLAYTYPE_FILE = 0x00000004; 
    const int RESOURCEDISPLAYTYPE_GROUP = 0x00000005; 

    const int RESOURCEUSAGE_CONNECTABLE = 0x00000001; 
    const int RESOURCEUSAGE_CONTAINER = 0x00000002; 


    const int CONNECT_INTERACTIVE = 0x00000008; 
    const int CONNECT_PROMPT = 0x00000010; 
    const int CONNECT_REDIRECT = 0x00000080; 
    const int CONNECT_UPDATE_PROFILE = 0x00000001; 
    const int CONNECT_COMMANDLINE = 0x00000800; 
    const int CONNECT_CMD_SAVECRED = 0x00001000; 

    const int CONNECT_LOCALDRIVE = 0x00000100; 
    #endregion 

    #region Errors 
    const int NO_ERROR = 0; 

    const int ERROR_ACCESS_DENIED = 5; 
    const int ERROR_ALREADY_ASSIGNED = 85; 
    const int ERROR_BAD_DEVICE = 1200; 
    const int ERROR_BAD_NET_NAME = 67; 
    const int ERROR_BAD_PROVIDER = 1204; 
    const int ERROR_CANCELLED = 1223; 
    const int ERROR_EXTENDED_ERROR = 1208; 
    const int ERROR_INVALID_ADDRESS = 487; 
    const int ERROR_INVALID_PARAMETER = 87; 
    const int ERROR_INVALID_PASSWORD = 1216; 
    const int ERROR_MORE_DATA = 234; 
    const int ERROR_NO_MORE_ITEMS = 259; 
    const int ERROR_NO_NET_OR_BAD_PATH = 1203; 
    const int ERROR_NO_NETWORK = 1222; 

    const int ERROR_BAD_PROFILE = 1206; 
    const int ERROR_CANNOT_OPEN_PROFILE = 1205; 
    const int ERROR_DEVICE_IN_USE = 2404; 
    const int ERROR_NOT_CONNECTED = 2250; 
    const int ERROR_OPEN_FILES = 2401; 

    private struct ErrorClass 
    { 
     public int num; 
     public string message; 
     public ErrorClass(int num, string message) 
     { 
      this.num = num; 
      this.message = message; 
     } 
    } 


    // Created with excel formula: 
    // ="new ErrorClass("&A1&", """&PROPER(SUBSTITUTE(MID(A1,7,LEN(A1)-6), "_", " "))&"""), " 
    private static ErrorClass[] ERROR_LIST = new ErrorClass[] { 
     new ErrorClass(ERROR_ACCESS_DENIED, "Error: Access Denied"), 
     new ErrorClass(ERROR_ALREADY_ASSIGNED, "Error: Already Assigned"), 
     new ErrorClass(ERROR_BAD_DEVICE, "Error: Bad Device"), 
     new ErrorClass(ERROR_BAD_NET_NAME, "Error: Bad Net Name"), 
     new ErrorClass(ERROR_BAD_PROVIDER, "Error: Bad Provider"), 
     new ErrorClass(ERROR_CANCELLED, "Error: Cancelled"), 
     new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
     new ErrorClass(ERROR_INVALID_ADDRESS, "Error: Invalid Address"), 
     new ErrorClass(ERROR_INVALID_PARAMETER, "Error: Invalid Parameter"), 
     new ErrorClass(ERROR_INVALID_PASSWORD, "Error: Invalid Password"), 
     new ErrorClass(ERROR_MORE_DATA, "Error: More Data"), 
     new ErrorClass(ERROR_NO_MORE_ITEMS, "Error: No More Items"), 
     new ErrorClass(ERROR_NO_NET_OR_BAD_PATH, "Error: No Net Or Bad Path"), 
     new ErrorClass(ERROR_NO_NETWORK, "Error: No Network"), 
     new ErrorClass(ERROR_BAD_PROFILE, "Error: Bad Profile"), 
     new ErrorClass(ERROR_CANNOT_OPEN_PROFILE, "Error: Cannot Open Profile"), 
     new ErrorClass(ERROR_DEVICE_IN_USE, "Error: Device In Use"), 
     new ErrorClass(ERROR_EXTENDED_ERROR, "Error: Extended Error"), 
     new ErrorClass(ERROR_NOT_CONNECTED, "Error: Not Connected"), 
     new ErrorClass(ERROR_OPEN_FILES, "Error: Open Files"), 
    }; 

    private static string getErrorForNumber(int errNum) 
    { 
     try 
     { 
      foreach (ErrorClass er in ERROR_LIST) 
      { 
       if (er.num == errNum) return er.message; 
      } 
      return "Error: Unknown, " + errNum; 
     } 
     catch (Exception _ex) 
     { 
      Console.WriteLine(String.Format("Error: (Pinvoke) Getting Error. Error Number: {0} Exception: {1}", errNum, _ex)); 
     } 
     return "Error: Unknown, " + errNum; 
    } 
    #endregion 

    [DllImport("Mpr.dll")] 
    private static extern int WNetUseConnection(
     IntPtr hwndOwner, 
     NETRESOURCE lpNetResource, 
     string lpPassword, 
     string lpUserID, 
     int dwFlags, 
     string lpAccessName, 
     string lpBufferSize, 
     string lpResult 
     ); 

    [DllImport("Mpr.dll")] 
    private static extern int WNetCancelConnection2(
     string lpName, 
     int dwFlags, 
     bool fForce 
     ); 

    [StructLayout(LayoutKind.Sequential)] 
    private class NETRESOURCE 
    { 
     public int dwScope = 0; 
     public int dwType = 0; 
     public int dwDisplayType = 0; 
     public int dwUsage = 0; 
     public string lpLocalName = ""; 
     public string lpRemoteName = ""; 
     public string lpComment = ""; 
     public string lpProvider = ""; 
    } 


    public static string connectToRemote(string remoteUNC, string username, string password) 
    { 
     try 
     { 
      return connectToRemote(remoteUNC, username, password, false); 
     } 
     catch (Exception _ex) 
     { 
      Console.WriteLine("Error: (Pinvoke) Getting Error connectToRemote" + _ex); 
     } 
     return connectToRemote(remoteUNC, username, password, false); 
    } 

    public static string connectToRemote(string remoteUNC, string username, string password, bool promptUser) 
    { 
     try 
     { 
      NETRESOURCE nr = new NETRESOURCE(); 
      nr.dwType = RESOURCETYPE_DISK; 
      nr.lpRemoteName = remoteUNC; 
      //   nr.lpLocalName = "F:"; 

      int ret; 
      if (promptUser) 
       ret = WNetUseConnection(IntPtr.Zero, nr, "", "", CONNECT_INTERACTIVE | CONNECT_PROMPT, null, null, null); 
      else 
       ret = WNetUseConnection(IntPtr.Zero, nr, password, username, 0, null, null, null); 

      if (ret == NO_ERROR) return null; 
      return getErrorForNumber(ret); 
     } 
     catch (Exception _ex) 
     { 
      Console.WriteLine("Error: (Pinvoke) Getting Error connectToRemote" + _ex); 
     } 
     return "Error: (Pinvoke) Getting Error connectToRemote"; 
    } 

    public static string disconnectRemote(string remoteUNC) 
    { 
     int ret = WNetCancelConnection2(remoteUNC, CONNECT_UPDATE_PROFILE, false); 
     if (ret == NO_ERROR) return null; 
     return getErrorForNumber(ret); 
    } 
} 

所以任何想法?

在此先感謝!

+2

可能的重複:http://stackoverflow.com/questions/7011655/access-to-a-windows-share-through-unc-path-before-the-session-opening – 2011-12-21 19:37:00

+1

請參閱上面的鏈接。這都是關於UNC路徑。如果用戶嘗試使用您的程序無法被服務器識別,您仍然會遇到登錄。 – digitlworld 2011-12-21 19:45:21

+1

我正在使用UNC路徑,我不能使用IP的唯一主機名 - 請參閱代碼 – rreeves 2011-12-21 20:23:23

回答

1

如前所述:Access to a windows share through UNC path, before the session opening

這是一種重複的,但短期的版本是使用UNC路徑:

\\hostnameorIP\sharename\folder\within\share\file.txt

您應該能夠像對待其他任何文件C#和罰款,沒有映射。這也直接在Windows資源管理器中工作。我一直這樣做,因爲在工作映射導致My computer和其他Windows資源管理器的事情運行速度較慢,如果連接到共享緩慢(對我來說,這是)。

喜歡的東西:

using System.IO; 
FileStream lFileStream = new FileStream(@"\\hostnameorIP\sharename\folder\within\share\file.txt",...); 

// Do stuff with it 

應該正常工作。

+2

我正在使用UNC路徑,我無法使用IP唯一的主機名 - 請參閱代碼 – rreeves 2011-12-21 20:23:34

+1

@rreeves我不是在談論如何使用您的代碼。我正在談論使用帶有標準C#文件/目錄訪問方法和類的UNC路徑。 P/Invoke在這裏似乎有點不必要。當您嘗試使用UNC路徑訪問共享時,它應該考慮身份驗證,其餘的應該幾乎是無縫的。 – digitlworld 2011-12-21 20:41:37

1

遠程服務器實際上是Samba服務器還是其他類型的SMB服務器(如Windows)?

Samba將允許通過IP地址進行連接,但大多數其他SMB服務器(如Windows)通常不會。並要求您擁有NetBIOS名稱。

相關問題