2009-09-08 4 views
1

Dans un programme VB.NET, je souhaite lire les fichiers d'un système de fichiers, puis écrire une version compressée de ces fichiers dans un partage de fichiers sécurisé et distant, en utilisant des informations d'identification différentes.Est-ce que je peux programmer un "net use" sur un partage de fichiers?

L'opération analogue à l'invite de cmd est:

net use s: \\server\share /user:foo [email protected] 
copy a+b | compress > s:\foo.bin 
net use s: /delete 

Est-ce possible? Comment? (Ne vous inquiétez pas de la compression et de l'entrée/sortie du fichier, je m'intéresse aux composants de sécurité.)

Est-ce que je le fais avec WindowsImpersonationContext?

EDIT: vous avez raison, je ne veux pas vraiment mapper un lecteur; ce que je veux faire est d'accéder à un partage avec des informations d'identification qui ne sont pas les informations d'identification par défaut. L'application est exécutée par toutes sortes d'utilisateurs et ne dispose pas d'un accès en écriture au partage normalement. Juste pour les besoins de ce fichier unique, je veux permettre aux utilisateurs d'écrire sur le partage.

Alors, comment écrire un seul fichier sur un partage, en utilisant d'autres informations d'identification? Gardez à l'esprit que j'ai besoin des informations d'identification par défaut ou de l'identité pour lire les fichiers qui agissent en entrée de la compression.

UserX reads files a1 and b1 as UserX, writes file c1 as UserA 
UserY reads files a2 and b2 as UserY, writes file c2 as UserA 

Est-ce logique? Je sais que je peux créer directement un fichier sur un partage. La question est de savoir comment faire avec des informations d'identification alternatives? Je sais comment passer des alt creds lors de la création d'un partage, c'est pourquoi j'ai introduit l'idée de créer un partage. Je n'ai pas vraiment besoin de partager, car il est fait seulement pour un seul fichier, et seulement dans un programme.

Et je sais que je pourrais d'abord créer le fichier, puis copier le fichier sur le partage. Je ne veux pas faire ça parce que c'est un gros fichier et j'aimerais le diffuser une fois.

+1

Je copier les fichiers directement sur \\ server \ share \ myfile.text plutôt que la cartographie \\ serveur \ partage à s: puis copie vers s: myfile.text. Si ce n'est pas pour une autre raison, mais que vous êtes en train d'invoquer des problèmes de configuration de l'utilisateur (déjà maquillé? Et si quelque chose échoue avant de vous déconnecter?) –

Répondre

2

Vous n'avez pas besoin de mapper un lecteur. Vous pouvez simplement créer le fichier \\ server \ share \ foo.bin directement.

Mais, si vous voulez vraiment, voici un code:

De http://www.mredkj.com/vbnet/vbnetmapdrive.html

 Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _ 
(ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, _ 
ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer 

    Public Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" _ 
(ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer 

     <StructLayout(LayoutKind.Sequential)> _ 
    Public Structure NETRESOURCE 
      Public dwScope As Integer 
      Public dwType As Integer 
      Public dwDisplayType As Integer 
      Public dwUsage As Integer 
      Public lpLocalName As String 
      Public lpRemoteName As String 
      Public lpComment As String 
      Public lpProvider As String 
     End Structure 

    Public Const ForceDisconnect As Integer = 1 
    Public Const RESOURCETYPE_DISK As Long = &H1 

    Public Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath As String) As Boolean 

      Dim nr As NETRESOURCE 
      Dim strUsername As String 
      Dim strPassword As String 

      nr = New NETRESOURCE 
      nr.lpRemoteName = UNCPath 
      nr.lpLocalName = DriveLetter & ":" 
      strUsername = Nothing '(add parameters to pass this if necessary) 
      strPassword = Nothing '(add parameters to pass this if necessary) 
      nr.dwType = RESOURCETYPE_DISK 

      Dim result As Integer 
      result = WNetAddConnection2(nr, strPassword, strUsername, 0) 

      If result = 0 Then 
       Return True 
      Else 
       Return False 
      End If 
     End Function 

    Public Function UnMapDrive(ByVal DriveLetter As String) As Boolean 
     Dim rc As Integer 
      rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect) 

      If rc = 0 Then 
       Return True 
      Else 
       Return False 
      End If 

     End Function 
+2

Je sais que je peux directement créer un fichier sur un partage . La question est de savoir comment faire avec des informations d'identification alternatives? Je sais comment passer des alt creds lors de la création d'un partage, c'est pourquoi j'ai introduit cela. Je n'ai pas vraiment besoin du partage, car il n'est fait que pour un seul fichier, et seulement dans un programme. – Cheeso

Questions connexes