Edanmo.IO.NetShare
Class
Option Explicit On Option Strict On Imports System Imports System.Collections Imports System.ComponentModel Imports System.Globalization Imports System.Management Namespace Edanmo.IO Public NotInheritable Class NetShare Implements IDisposable Private _share As ManagementObject Private Sub New(ByVal share As ManagementObject) _share = share End Sub ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the share access rights for the current user or group. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property AccessMask() As AccessMasks Get Return CType(Convert.ToInt32(_share.InvokeMethod("GetAccessMask", Nothing), CultureInfo.InvariantCulture), AccessMasks) End Get End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets or sets the maximum number of user connections. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Property AllowMaximum() As Integer Get Return Convert.ToInt32(_share.GetPropertyValue("AllowMaximum"), CultureInfo.InvariantCulture) End Get Set(ByVal value As Integer) Me.SetShareInfo(value, Me.Description, Nothing) End Set End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the share description. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Property Description() As String Get Return _share.GetPropertyValue("Description").ToString End Get Set(ByVal value As String) Me.SetShareInfo(Me.MaximumAllowed, value, Nothing) End Set End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Property MaximumAllowed() As Integer Get Return Convert.ToInt32(_share.GetPropertyValue("MaximumAllowed"), CultureInfo.InvariantCulture) End Get Set(ByVal value As Integer) Me.SetShareInfo(value, Me.Description, Nothing) End Set End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the share name. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Name() As String Get Return _share.GetPropertyValue("Name").ToString End Get End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the local path of the share. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Path() As String Get Return _share.GetPropertyValue("Path").ToString End Get End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the share status. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Status() As String Get Return _share.GetPropertyValue("Status").ToString End Get End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Gets the share type. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public ReadOnly Property Type() As ShareType Get Dim typeValue64 As Long = Convert.ToInt64(_share.GetPropertyValue("Type"), CultureInfo.InvariantCulture) Dim typeValue32 As Integer If (typeValue64 And &H80000000) > 0 Then typeValue32 = &H80000000 Or Convert.ToInt32(typeValue64 And &H7FFFFFFF, CultureInfo.InvariantCulture) Else typeValue32 = Convert.ToInt32(typeValue64, CultureInfo.InvariantCulture) End If Return CType(typeValue32, ShareType) End Get End Property ''' ----------------------------------------------------------------------------- ''' <summary> ''' Creates a shared folder in the local computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function Create( _ ByVal path As String, _ ByVal name As String) As NetShare Return Create(".", path, ShareType.DiskDrive, name, -1, Nothing, Nothing) End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Creates a shared folder in the local computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function Create( _ ByVal path As String, _ ByVal name As String, _ ByVal password As String) As NetShare Return Create(".", path, ShareType.DiskDrive, name, -1, Nothing, password) End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Creates a shared folder in the local computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function Create( _ ByVal path As String, _ ByVal type As ShareType, _ ByVal name As String, _ ByVal maximumAllowed As Integer, _ ByVal description As String, _ ByVal password As String) As NetShare Return Create(".", path, type, name, maximumAllowed, description, password) End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Creates a shared resource in the specified computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function Create( _ ByVal computerName As String, _ ByVal path As String, _ ByVal type As ShareType, _ ByVal name As String, _ ByVal maximumAllowed As Integer, _ ByVal description As String, _ ByVal password As String) As NetShare Dim shareClass As New System.Management.ManagementClass(String.Format("\\{0}\root\cimv2:Win32_Share", computerName)) Dim res As Integer Try If maximumAllowed < 0 Then res = Convert.ToInt32( _ shareClass.InvokeMethod("Create", _ New Object() {path, name, type, Nothing, description, password, Nothing}), CultureInfo.InvariantCulture) Else res = Convert.ToInt32( _ shareClass.InvokeMethod("Create", _ New Object() {path, name, type, maximumAllowed, description, password, Nothing}), CultureInfo.InvariantCulture) End If If res <> 0 Then ThrowException(res) Return GetShare(computerName, name) Finally shareClass.Dispose() End Try End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Returns a NetShare object that represents the shared resource in the ''' specified computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function GetShare(ByVal computerName As String, ByVal shareName As String) As NetShare Dim share As ManagementObject share = New ManagementObject(String.Format("\\{0}\root\cimv2:Win32_Share.Name=""{1}""", computerName, shareName)) share.Get() Return New NetShare(share) End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Returns a NetShare object that represents the shared resource. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function GetShare(ByVal shareName As String) As NetShare Return GetShare(".", shareName) End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Returns the names of shared resources in the specified computer. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function GetShares(ByVal computername As String) As String() ' Get the Win32_Share class Dim shareClass As New System.Management.ManagementClass(String.Format("\\{0}\root\cimv2:Win32_Share", computername)) Dim shares As ManagementObjectCollection Try Dim shareNames As New ArrayList ' Get the Win32_Share instances shares = shareClass.GetInstances ' Enumerate all instances For Each share As ManagementObject In shares Try ' Add the name to the list shareNames.Add(share.GetPropertyValue("Name")) Finally ' Release the WMI object share.Dispose() End Try Next ' Return the list as an array Return DirectCast(shareNames.ToArray(GetType(String)), String()) Finally ' Release the WMI object shareClass.Dispose() End Try End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Returns the names of shared resources in the local computer. ''' </summary> ''' <returns></returns> ''' <remarks> ''' </remarks> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Shared Function GetShares() As String() Return GetShares(".") End Function ''' ----------------------------------------------------------------------------- ''' <summary> ''' Stops sharing the folder. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Public Sub Delete() Dim res As Integer res = Convert.ToInt32(_share.InvokeMethod("Delete", Nothing), CultureInfo.InvariantCulture) If res <> 0 Then ThrowException(res) End Sub Public Sub Dispose() Implements System.IDisposable.Dispose ' Dispose the WMI object _share.Dispose() GC.SuppressFinalize(Me) End Sub ''' ----------------------------------------------------------------------------- ''' <summary> ''' Sets the share info. ''' </summary> ''' <remarks>The security descriptor is not supported by this class.</remarks> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Private Sub SetShareInfo( _ ByVal maximumAllowed As Integer, _ ByVal description As String, _ ByVal descriptor As ManagementBaseObject) Dim res As Integer ' Set the share info res = Convert.ToInt32(_share.InvokeMethod("SetShareInfo", New Object() {maximumAllowed, description, descriptor}), CultureInfo.InvariantCulture) If res <> 0 Then ThrowException(res) End Sub ''' ----------------------------------------------------------------------------- ''' <summary> ''' Throws an exception for the specified WMI error number. ''' </summary> ''' <history> ''' [Eduardo Morcillo] 11/08/2004 Created ''' </history> ''' ----------------------------------------------------------------------------- Private Shared Sub ThrowException(ByVal res As Integer) Select Case res Case 2 ' Access denied Throw New Win32Exception(65) Case 9 ' Invalid name Throw New Win32Exception(1215) Case 10 ' Invalid level Throw New Win32Exception(124) Case 21 ' Invalid parameter Throw New Win32Exception(87) Case 22 ' Duplicate Share Throw New Win32Exception(2118) Case 23 ' Redirected Path Throw New Win32Exception(2117) Case 24 ' Unknown device Or directory Throw New Win32Exception(2116) Case 25 ' Net name not found Throw New Win32Exception(67) Case Else Throw New Exception("Unknown error: " & res) End Select End Sub End Class Public Enum ShareType As Integer DiskDrive = 0 PrintQueue = 1 Device = 2 Ipc = 3 DiskDriveAdmin = &H80000000 PrintQueueAdmin = &H80000001 DeviceAdmin = &H80000002 IpcAdmin = &H80000003 End Enum <Flags()> Public Enum AccessMasks As Integer ListDirectory = &H1 AddFile = &H2 AddSubdirectory = &H4 ReadExtendedAttributes = &H8 WriteExtendedAttributes = &H10 Traverse = &H20 DeleteChild = &H40 ReadAttributes = &H80 WriteAttributes = &H100 Delete = &H10000 ReadControl = &H20000 WriteDac = &H40000 WriteOwner = &H80000 Synchronize = &H100000 Read = ListDirectory Or ReadExtendedAttributes Or ReadAttributes Or ReadControl Or Synchronize ReadAndExecute = Read Or Traverse Write = AddFile Or AddSubdirectory Or WriteExtendedAttributes Or WriteAttributes Or Synchronize Modify = Read Or Write Or Delete Or Traverse FullControl = DeleteChild Or WriteDac Or WriteOwner Or Modify End Enum End Namespace