如何使用PowerShell调用NetLocalGroupGetMembers?请提供示例代码
PowerShell调用NetLocalGroupGetMembers示例
导入函数定义
先把以下代码在PowerShell会话中运行,定义NetLocalGroupGetMembers函数(基于你找到的PSReflect实现逻辑):
Add-Type -TypeDefinition @" using System; using System.Runtime.InteropServices; public class NetApi32 { [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern uint NetLocalGroupGetMembers( string servername, string groupname, uint level, out IntPtr bufptr, uint prefmaxlen, out uint entriesread, out uint totalentries, out uint resumehandle ); [DllImport("netapi32.dll", SetLastError = true)] public static extern uint NetApiBufferFree(IntPtr buffer); } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct LOCALGROUP_MEMBERS_INFO_0 { public IntPtr lgrmi_sid; public uint lgrmi_sidtype; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct LOCALGROUP_MEMBERS_INFO_1 { public string lgrmi_name; public uint lgrmi_sidtype; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct LOCALGROUP_MEMBERS_INFO_2 { public string lgrmi_name; public string lgrmi_comment; public uint lgrmi_sidtype; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct LOCALGROUP_MEMBERS_INFO_3 { public IntPtr lgrmi_sid; public string lgrmi_sidstring; public uint lgrmi_sidtype; } "@ function NetLocalGroupGetMembers { [CmdletBinding()] param( [string]$ComputerName, [Parameter(Mandatory=$true)] [string]$GroupName, [uint]$Level = 1 ) $ptr = [IntPtr]::Zero $entriesRead = 0 $totalEntries = 0 $resumeHandle = 0 try { $result = [NetApi32]::NetLocalGroupGetMembers( $ComputerName, $GroupName, $Level, [ref]$ptr, 0xFFFFFFFF, [ref]$entriesRead, [ref]$totalEntries, [ref]$resumeHandle ) if ($result -ne 0) { throw "NetLocalGroupGetMembers调用失败,错误码: $result" } if ($entriesRead -eq 0) { return } $structType = switch ($Level) { 0 { [LOCALGROUP_MEMBERS_INFO_0] } 1 { [LOCALGROUP_MEMBERS_INFO_1] } 2 { [LOCALGROUP_MEMBERS_INFO_2] } 3 { [LOCALGROUP_MEMBERS_INFO_3] } default { throw "不支持的Level参数: $Level" } } $structSize = [System.Runtime.InteropServices.Marshal]::SizeOf($structType) $currentPtr = $ptr for ($i = 0; $i -lt $entriesRead; $i++) { $member = [System.Runtime.InteropServices.Marshal]::PtrToStructure($currentPtr, $structType) $member $currentPtr = [IntPtr]::Add($currentPtr, $structSize) } } finally { if ($ptr -ne [IntPtr]::Zero) { [NetApi32]::NetApiBufferFree($ptr) | Out-Null } } }
调用函数获取组成员
- 查询本地
Administrators组的成员:
$adminMembers = NetLocalGroupGetMembers -GroupName "Administrators"
- 查询远程计算机的组(需具备对应权限):
$remoteUsers = NetLocalGroupGetMembers -ComputerName "RemotePC01" -GroupName "Users"
解析并输出可读结果
函数返回的是结构体对象,你可以转换成更直观的格式:
$adminMembers | ForEach-Object { [PSCustomObject]@{ 账户名 = $_.lgrmi_name SID类型 = switch ($_.lgrmi_sidtype) { 1 { "用户" } 2 { "全局组" } 3 { "本地组" } 4 { "域" } 5 { "别名" } 6 { "已知组" } 7 { "已删除账户" } 8 { "无效SID" } default { "未知类型($($_.lgrmi_sidtype))" } } } }
内容的提问来源于stack exchange,提问作者n03z
相关产品推荐
相关产品推荐

