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