タイトル : 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 |