无需安装ActiveDirectory模块,如何获取计算机的直接与嵌套组令牌?
不依赖ActiveDirectory模块获取计算机的直接和嵌套组成员身份
可以直接使用Windows系统默认自带的.NET System.DirectoryServices类实现需求,无需安装ActiveDirectory模块,核心逻辑和你用AD模块的代码一致,只是换成了原生AD访问方式:
# 目标计算机名称 $computerName = "machinename" # 替换为你的域名(也可以指定域控制器地址) $domain = "yourdomain.com" # 搜索定位目标计算机的LDAP路径 $searcher = New-Object System.DirectoryServices.DirectorySearcher( [ADSI]"LDAP://$domain", "(&(objectCategory=computer)(name=$computerName))", @("distinguishedName") ) $computerResult = $searcher.FindOne() if (-not $computerResult) { Write-Error "未找到目标计算机: $computerName" exit } # 绑定到AD计算机对象并读取tokenGroups属性 $computerDN = $computerResult.Properties["distinguishedname"][0] $computerADSI = [ADSI]"LDAP://$domain/$computerDN" $computerADSI.RefreshCache(@("tokenGroups")) $tokenGroups = $computerADSI.Properties["tokenGroups"] # 将SID转换为可读的组名称 $groupNames = $tokenGroups | ForEach-Object { $sid = New-Object System.Security.Principal.SecurityIdentifier($_) try { $sid.Translate([System.Security.Principal.NTAccount]).Value } catch { Write-Warning "无法解析SID: $_" $sid.Value } } # 输出结果 $groupNames
关键说明:
- 无额外依赖:
System.DirectoryServices是Windows系统默认包含的.NET类库,不需要安装任何模块或组件。 - 和AD模块逻辑对齐:同样通过读取
tokenGroups属性获取计算机账户的所有组令牌(包含直接和嵌套成员关系),和Get-ADObject获取的属性完全一致。 - 避免硬编码路径:用
DirectorySearcher自动定位计算机的LDAP路径,不用手动指定OU信息。 - 健壮性处理:添加了计算机不存在的判断和SID解析失败的捕获,避免脚本直接报错中断。
需要注意的是,计算机账户的令牌无法通过WindowsIdentity直接获取(WindowsIdentity针对的是当前登录用户/进程身份),必须通过AD查询读取计算机对象的tokenGroups属性才能拿到完整的直接+嵌套组信息。
内容的提问来源于stack exchange,提问作者L3dz3pp3l1n
相关产品推荐
相关产品推荐

