tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: グループ名の取得について
投稿日: 2004/12/09(Thu) 13:30
投稿者魔界の仮面弁士
> 以前「Unicode変換について」という質問をさせていただきました。
どれの事かわかるよう、記事番号を併記すると良いかも。

> その後の処理がVB6とは異なった結果になってしまいます。
文字列のマーシャリングに問題があるような…。


> 以下は某サイトを参考に作成し、.NETに移行した実際の関数コードです。
某サイトって、vbvbvb.com ですよね。スペルミスまでそのまま写されてます。(汗)


NetUserGetLocalGroups API を呼ぶなら、こんな感じでどうですかね。


Imports System.Runtime.InteropServices
Namespace Orator.Win32
    Public Class Network
        Private Const LG_INCLUDE_INDIRECT As Integer = &H1I
        Private Const MAX_PREFERRED_LENGTH As Integer = -1I
        Private Enum NET_API_STATUS As Integer
            ERROR_ACCESS_DENIED = 5I
            ERROR_MORE_DATA = 234I
            RPC_S_SERVER_UNAVAILABLE = 1722I
            NERR_InvalidComputer = 2351I
            NERR_UserNotFound = 2221I
            NERR_Success = 0I
        End Enum
        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
        Private Structure LOCALGROUP_USERS_INFO_0
            Public lgrui0_name As String
        End Structure
        Private Declare Unicode Function NetUserGetLocalGroups Lib "netapi32" _
            (ByVal ServerName As String, _
             ByVal username As String, _
             ByVal level As Integer, _
             ByVal flag As Integer, _
             ByRef bufptr As IntPtr, _
             ByVal prefmaxlen As Integer, _
             ByRef entriesread As Integer, _
             ByRef totalentries As Integer) As NET_API_STATUS
        Private Declare Function NetApiBufferFree Lib "netapi32" (ByVal Buffer As IntPtr) As Integer
        Public Overloads Shared Function GetLocalGroups(ByVal UserName As String) As String()
            Return GetLocalGroups(Nothing, UserName)
        End Function
        Public Overloads Shared Function GetLocalGroups(ByVal ServerName As String, ByVal UserName As String) As String()
            Dim List() As String = New String() {}
            Dim BufPtr As IntPtr = IntPtr.Zero
            Try
                Dim EntriesRead, TotalEntries As Integer
                Dim Result As NET_API_STATUS = NetUserGetLocalGroups(ServerName, UserName, 0, LG_INCLUDE_INDIRECT, BufPtr, MAX_PREFERRED_LENGTH, EntriesRead, TotalEntries)
                If (Result = NET_API_STATUS.NERR_Success) OrElse (Result = NET_API_STATUS.ERROR_MORE_DATA) Then
                    Dim P As IntPtr = BufPtr
                    ReDim List(EntriesRead - 1)
                    For Entry As Integer = 0 To EntriesRead - 1
                        Dim GInfo0 As LOCALGROUP_USERS_INFO_0 = DirectCast(Marshal.PtrToStructure(P, GetType(LOCALGROUP_USERS_INFO_0)), LOCALGROUP_USERS_INFO_0)
                        List(Entry) = GInfo0.lgrui0_name.ToString()
                        P = New IntPtr(P.ToInt32() + Marshal.SizeOf(GetType(LOCALGROUP_USERS_INFO_0)))
                    Next
                ElseIf Result = NET_API_STATUS.ERROR_ACCESS_DENIED Then
                    Throw New System.Exception("ユーザーには、要求した情報へのアクセス権がありません。")
                ElseIf Result = NET_API_STATUS.NERR_InvalidComputer Then
                    Throw New System.Exception("コンピュータ名が無効です。")
                ElseIf Result = NET_API_STATUS.NERR_UserNotFound Then
                    Throw New System.Exception("指定されたユーザー名が見つかりませんでした。 ")
                ElseIf Result = NET_API_STATUS.RPC_S_SERVER_UNAVAILABLE Then
                    Throw New System.Exception("RPC サーバーを利用できません。")
                Else
                    Throw New System.Exception("NetUserGetLocalGroups : 0x" & Result.ToString("x"))
                End If
            Finally
                If Not IntPtr.Zero.Equals(BufPtr) Then
                    NetApiBufferFree(BufPtr)
                    BufPtr = IntPtr.Zero
                End If
            End Try
            Return List
        End Function
    End Class
End Namespace

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。