Laden...

Authentisierung mit einem Netzlaufwek

Erstellt von Kasperdelasopa vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.149 Views
K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren
Authentisierung mit einem Netzlaufwek

[EDIT=herbivore]Bitte keine Crossposts ==> gleichlautenden Crosspost entfernt.[/EDIT]

Hi zusammen,

Ich habe ein paar Netzlaufwerke die einen Benutzernamen und Passwort benötigen.
Nun möchte ich automatisiert dort Dateien hinkopieren.

Hierzu müsste ich haber testen ob ich mich schon ab Netzlaufwerk angemeldet habe.

Wenn ich das manuell durchführe erscheint ja ein Dialog in dem Ich meinen Benutzernamen und Passwort eintippe.

Wie finde ich heraus ob ich dieses Passwort mit Usernamen noch angeben muss?

Bzw: kann ich beim verschieben von Dateien gleich mit angeben welchen Benutzernamen und welches Password verwendet werden soll wenn es den gefordert wird?

Gruß

691 Beiträge seit 2007
vor 14 Jahren

Wie finde ich heraus ob ich dieses Passwort mit Usernamen noch angeben muss?

Du könntest z.B. mit System.Io.File.Exists oder ähnlichem überprüfen, ob du Zugriff auf das Netzlaufwerkhast.

Bzw: kann ich beim verschieben von Dateien gleich mit angeben welchen Benutzernamen und welches Password verwendet werden soll wenn es den gefordert wird?

Es ist codetechnisch möglich, ein Netzlaufwerk mit Benutzername/Passwort zu mounten. Von daher würde ich hier sagen, ja.

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de

K
Kasperdelasopa Themenstarter:in
118 Beiträge seit 2006
vor 14 Jahren

Ok, das mit dem Zugriff testen könnte ich versuchen.

Ich möchte aber ein Laufwerk nicht mounten. Ich möchte auf ein bereits gemountetes Laufwerk zugreifen können und gegebenenfalls ein gefordertes Passwort mit Benutzernamen übergeben können um eine Datei dort hinzuschreiben.

Gruß

1.564 Beiträge seit 2007
vor 14 Jahren

Hier eine Methode die verwende um einen UNC-Pfad zu verbinden:


      [DllImport("mpr.dll")]
      private extern static int WNetAddConnection2A(
         [MarshalAs(UnmanagedType.LPArray)] NETRESOURCEA[] lpNetResource,
         [MarshalAs(UnmanagedType.LPStr)] string lpPassword,
         [MarshalAs(UnmanagedType.LPStr)] string lpUserName,
         int dwFlags);

      [StructLayout(LayoutKind.Sequential)]
      private struct NETRESOURCEA
      {
         public int dwScope;
         public int dwType;
         public int dwDisplayType;
         public int dwUsage;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpLocalName;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpRemoteName;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpComment;
         [MarshalAs(UnmanagedType.LPStr)]
         public string lpProvider;
      }

      // Resource type
      private const int RESOURCETYPE_ANY = 0x00000000;
      private const int RESOURCETYPE_DISK = 0x00000001;
      private const int RESOURCETYPE_PRINT = 0x00000002;

      private const int NERR_Success = 0;

      /// <summary>
      /// Connect to a network drive
      /// </summary>
      /// <param name="uncPath">The UNC path (e.g. "\\Server1\Share1")</param>
      /// <param name="driveLetter">The drive letter to map</param>
      /// <param name="userName">The username to connect the device</param>
      /// <param name="password">The password</param>
      /// <returns>True if mapped</returns>
      /// <example>Connect(@"\\Server1\Share1", "Z:", "myuser", "mypwd")</example>
      public static bool Connect(string uncPath, string driveLetter, string userName, string password)
      {
         NETRESOURCEA[] netResource = new NETRESOURCEA[1];
         netResource[0].lpRemoteName = uncPath;
         netResource[0].lpLocalName = driveLetter;
         netResource[0].dwType = RESOURCETYPE_DISK;
         netResource[0].lpProvider = null;

         int ret = WNetAddConnection2A(netResource, password, userName, 1);

         if (ret != NERR_Success)
         {
            throw new System.ComponentModel.Win32Exception(ret);
         }

         return true;
      }

Du kannst als driveLetter "" übergeben.

Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

373 Beiträge seit 2006
vor 14 Jahren

Hy,

du wirst in Windows nur dann nach dem Username und Passwort gefragt, wenn der in Windows angemeldet User keine Berechtigungen auf dem Netzlaufwerk besitzt ("nichtvorhandensein" des Users inklusive)!

ich habe bei mir das folgendermaßen gelöst: zu jedem Netzlaufwerk gibt es ja einen UNC-Pfad wie z.B. \meinserver.... oder ne IP \100.200.50.x....

Du kannst deinen Netzlaufwerksbuchstaben in einen UNC-Pfad umwandeln (das geht, das ist ein WIN32 Befehl, den ich grade nicht parat habe => einfach mal googlen).

Dann einfach die Impersonation (Doku-Link). Mit der Impersonierung kannst du mittem im code eine andere Identität annehmen.

Danach kopierst du deine Sachen auf den Pfad oder was immer du machen willst.

Danach musst du umbedingt die Impersonierung rückgängig mach (der Befehl heißt "undo"), sonst läuft dein Programm immer noch mit dem User weiter!

So habe ich das gelöst. Ich hoffe das hilft dir weiter!

MfG
Tonka

X
1.177 Beiträge seit 2006
vor 14 Jahren

huhu,

Prinzipiell würde ich garnicht von gemounteten Laufwerken ausgehen (man erhält sie aber über System.IO.DriveInfo.GetDrives()) sondern immer von UNC-Pfaden.

Wenn der angemeldete Benutzer schreibrechte hat, dann kümmert sich Windows im Hintergrund um die Authentifizierung und du kannst einfach Dateien dorthin schreiben. Andernfals bekommst Du eine UnauthorizedAccessException.

😃

Xynratron

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.