VB.NET下通过WMI共享文件夹

类别:.NET开发 点击:0 评论:0 推荐:
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


http://www.applevb.com

本文地址:http://com.8s8s.com/it/it41951.htm