NetEnumUsers( string servername, int resumeHandle, out LUGEnumStatus enumStatus ) { uint result = (uint)LUGAPI.WinError.ERROR_SUCCESS; if (String.IsNullOrEmpty(servername)) { servername = null; } enumStatus = new LUGEnumStatus(); enumStatus.initializeToNull(); enumStatus.type = LUGType.User; IntPtr bufPtr = IntPtr.Zero; try { int localResumeHandle = resumeHandle; int totalEntries = 0; int entriesRead = 0; if (!NetApiInitCalled) { result = NetApiInit(); if (result != (uint)LUGAPI.WinError.ERROR_SUCCESS) { return result; } NetApiInitCalled = true; } result = apiNetUserEnum( servername, 20, 2, out bufPtr, MAX_PREFERRED_LENGTH, ref entriesRead, ref totalEntries, ref localResumeHandle ); if (result != (uint)LUGAPI.WinError.ERROR_SUCCESS && result != (uint)LUGAPI.WinError.ERROR_MORE_DATA) { return result; } enumStatus.entriesRead = entriesRead; enumStatus.totalEntries = totalEntries; enumStatus.resumeHandle = localResumeHandle; if (entriesRead > 0) { USER_INFO_20[] users = new USER_INFO_20[entriesRead]; IntPtr iter = bufPtr; enumStatus.entries = new List<string[]>(); for (int i = 0; i < entriesRead; i++) { users[i] = (USER_INFO_20)Marshal.PtrToStructure(iter, typeof(USER_INFO_20)); iter = (IntPtr)((long)iter + Marshal.SizeOf(typeof(USER_INFO_20))); string[] userInfo ={"",(users[i].usri20_flags & UF_ACCOUNTDISABLE) != 0 ? DISABLED : "",users[i].usri20_name, users[i].usri20_full_name,users[i].usri20_comment }; enumStatus.entries.Add(userInfo); } if (result == (int)LUGAPI.WinError.ERROR_MORE_DATA) { enumStatus.moreEntries = true; } } } catch (Exception) { result = (uint)LUGAPI.WinError.ERROR_EXCEPTION_IN_SERVICE; } finally { if (bufPtr != IntPtr.Zero) { NetApiBufferFree(bufPtr); } } return result; }
NetEnumGroups( string servername, int resumeHandle, out LUGEnumStatus enumStatus ) { uint result = (uint)LUGAPI.WinError.ERROR_SUCCESS; if (String.IsNullOrEmpty(servername)) { servername = null; } enumStatus = new LUGEnumStatus(); enumStatus.initializeToNull(); enumStatus.type = LUGType.Group; IntPtr bufPtr = IntPtr.Zero; try { int entriesRead = 0; int totalEntries = 0; int localResumeHandle = resumeHandle; if (!NetApiInitCalled) { result = NetApiInit(); if (result != (uint)LUGAPI.WinError.ERROR_SUCCESS) { return result; } NetApiInitCalled = true; } result = apiNetLocalGroupEnum( servername, 1, out bufPtr, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, ref localResumeHandle ); if (result != (uint)LUGAPI.WinError.ERROR_SUCCESS && result != (uint)LUGAPI.WinError.ERROR_MORE_DATA) { return result; } enumStatus.entriesRead = entriesRead; enumStatus.totalEntries = totalEntries; enumStatus.resumeHandle = localResumeHandle; if (entriesRead > 0) { LOCALGROUP_INFO_1[] group = new LOCALGROUP_INFO_1[entriesRead]; IntPtr iter = bufPtr; enumStatus.entries = new List<string[]>(); for (int i = 0; i < entriesRead; i++) { group[i] = (LOCALGROUP_INFO_1)Marshal.PtrToStructure(iter, typeof(LOCALGROUP_INFO_1)); iter = (IntPtr)((long)iter + Marshal.SizeOf(typeof(LOCALGROUP_INFO_1))); string[] groupInfo ={ "", group[i].name, group[i].comment }; enumStatus.entries.Add(groupInfo); } } if (result == (int)LUGAPI.WinError.ERROR_MORE_DATA) { enumStatus.moreEntries = true; } } catch (Exception) { result = (uint)LUGAPI.WinError.ERROR_EXCEPTION_IN_SERVICE; } finally { if (bufPtr != IntPtr.Zero) { NetApiBufferFree(bufPtr); } } return result; }