当计算机不在活动目录中时,如何获取本地计算机组/用户列表?

编程入门 行业动态 更新时间:2024-10-24 03:25:02
本文介绍了当计算机不在活动目录中时,如何获取本地计算机组/用户列表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

当Windows计算机不是AD成员并且无法使用LDAP搜索时,是否可以通过C#获取本地组和用户列表?

Is there a way to get in C# a list of local groups and users, when the windows machine is no AD member and an LDAP search can't be used?

推荐答案

您可以使用P / Invoke调用本地网络管理API 来获取本地用户名和组名:

You can use P/Invoke to call the native network management API to get local user and group names:

static class NativeMethods { [DllImport("netapi32.dll")] public static extern void NetApiBufferFree(IntPtr bufptr); [DllImport("netapi32.dll")] public static extern UInt32 NetUserEnum([MarshalAs(UnmanagedType.LPWStr)] String servername, UInt32 level, UInt32 filter, ref IntPtr bufptr, UInt32 prefmaxlen, ref UInt32 entriesread, ref UInt32 totalentries, IntPtr resumehandle); [DllImport("netapi32.dll")] public static extern UInt32 NetLocalGroupEnum([MarshalAs(UnmanagedType.LPWStr)] String servername, UInt32 level, ref IntPtr bufptr, UInt32 prefmaxlen, ref UInt32 entriesread, ref UInt32 totalentries, IntPtr resumehandle); [DllImport("Netapi32.dll")] public extern static UInt32 NetLocalGroupGetMembers([MarshalAs(UnmanagedType.LPWStr)] String servername, [MarshalAs(UnmanagedType.LPWStr)] String localgroupname, UInt32 level, ref IntPtr bufptr, UInt32 prefmaxlen, ref UInt32 entriesread, ref UInt32 totalentries, IntPtr resumehandle); }

API可让您获取有关用户的各种信息。如果只希望使用名称,则可以使用以下功能:

The API allows you to get various information about users. If you only want names you can use this function:

IEnumerable<String> GetUserNames() { var buffer = IntPtr.Zero; try { UInt32 entriesRead = 0; UInt32 totalEntries = 0; var result = NativeMethods.NetUserEnum(null, 0, 0, ref buffer, UInt32.MaxValue, ref entriesRead, ref totalEntries, IntPtr.Zero); if (result != 0) throw new Win32Exception((Int32) result); var userNames = Enumerable .Range(0, (Int32) entriesRead) .Select( i => { var userInfo = Marshal.ReadIntPtr(buffer, i*IntPtr.Size); var userName = Marshal.PtrToStringAuto(userInfo); return userName; } ) .ToList(); return userNames; } finally { NativeMethods.NetApiBufferFree(buffer); } }

LINQ语句用于解析缓冲区包含 USER_INFO_0 结构。如果您要查询其他信息,则必须做更多详细的解析。

The LINQ statement is used to "parse" the buffer that contains USER_INFO_0 strutures. If you are querying for additional information you will have to do more elaborate "parsing".

同样,您可以获得本地组名:

Likewise you can get local group names:

IEnumerable<String> GetLocalGroupNames() { var buffer = IntPtr.Zero; try { UInt32 entriesRead = 0; UInt32 totalEntries = 0; var result = NativeMethods.NetLocalGroupEnum(null, 0, ref buffer, UInt32.MaxValue, ref entriesRead, ref totalEntries, IntPtr.Zero); if (result != 0) throw new Win32Exception((Int32) result); var localGroupNames = Enumerable .Range(0, (Int32) entriesRead) .Select( i => { var localGroupInfo = Marshal.ReadIntPtr(buffer, i*IntPtr.Size); var groupName = Marshal.PtrToStringAuto(localGroupInfo); return groupName; } ) .ToList(); return localGroupNames; } finally { NativeMethods.NetApiBufferFree(buffer); } }

缓冲区中的结构为 LOCALGROUP_INFO_0 具有与 USER_INFO_0 结构相同的布局,因此解析代码相同。

The structures in the buffer are LOCALGROUP_INFO_0 with the same layout as the USER_INFO_0 structure so the "parsing" code is identical.

最后,这是如何使用 LOCALGROUP_MEMBERS_INFO_3 结构:

Finally, here is how to get group membership using the LOCALGROUP_MEMBERS_INFO_3 structure:

IEnumerable<String> GetLocalGroupUsers(String localGroupName) { var buffer = IntPtr.Zero; try { UInt32 entriesRead = 0; UInt32 totalEntries = 0; var result = NativeMethods.NetLocalGroupGetMembers(null, localGroupName, 3, ref buffer, UInt32.MaxValue, ref entriesRead, ref totalEntries, IntPtr.Zero); if (result != 0) throw new Win32Exception((Int32) result); var userNames = Enumerable .Range(0, (Int32) entriesRead) .Select( i => { var membersInfo = Marshal.ReadIntPtr(buffer, i*IntPtr.Size); var userName = Marshal.PtrToStringAuto(membersInfo ); return userName; } ) .ToList(); return userNames; } finally { NativeMethods.NetApiBufferFree(buffer); } }

更多推荐

当计算机不在活动目录中时,如何获取本地计算机组/用户列表?

本文发布于:2023-11-11 10:32:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1578175.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:机组   中时   用户列表   计算机   目录

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!