You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:51:02