powershell - 本地管理员报告未显示域组
问题描述
我试图让以下脚本将一组服务器上的所有本地管理员成员和域组导出到 csv 中。导出本地管理员工作正常,但我注意到它不导出域组(即:我有一个域管理员组在本地管理员组中,它没有显示在 csv 中)。
这是我的代码,任何帮助将不胜感激:
param(
[parameter(Position=0,ValueFromPipeline=$true)]
$ComputerName=[Net.Dns]::GetHostName(),
[System.Management.Automation.PSCredential] $Credential,
[UInt32] $BlockSize=50
)
begin {
$WMIEnumOpts = new-object System.Management.EnumerationOptions
$WMIEnumOpts.BlockSize = $BlockSize
function Get-LocalAdminGroupMember {
param(
[String] $computerName,
[System.Management.Automation.PSCredential] $credential
)
$params = @{
"Class" = "Win32_Group"
"ComputerName" = $computerName
"Filter" = "LocalAccount=TRUE and SID='S-1-5-32-544'"
}
if ( $credential ) {
if ( $computerName -eq [Net.Dns]::GetHostName() ) {
Write-Warning "The -Credential parameter is ignored for the current computer."
}
else {
$params.Add("Credential", $credential)
}
}
Get-WmiObject @params | ForEach-Object {
$groupName = $_.Name
$_.GetRelated("Win32_Account","Win32_GroupUser","","",
"PartComponent","GroupComponent",$false,$WMIEnumOpts) | Select-Object `
@{Name="ComputerName"; Expression={$_.__SERVER}},
@{Name="Name"; Expression={$groupName}},
@{Name="Member"; Expression={$_.Caption -replace "^$($_.__SERVER)\\", ""}},
@{Name="Type"; Expression={$_.__CLASS}}
}
}
}
process {
$Filename = PATH HERE
$OutFileName = "C:\temp\admins.csv"
Get-Content $Filename | Foreach-Object {Get-LocalAdminGroupMember -computerName $_ | Select-Object * | Export-csv -NoType $OutFileName -Append}
解决方案
啊,尝试从远程计算机访问网络资源的乐趣。您将失去任何您正在做的事情的域帐户。这就是它的工作原理。好消息是,仍然有一种方法可以获取您想要的信息,如果您愿意,您甚至可以使用Get-WmiObject
它。如果您还没有重命名管理员组(因为真的,谁这样做?),您可以轻松地做到这一点,但如果您这样做并且您必须像上面那样按 SID 查找组,那么您将不得不查询像您一样的远程服务器,并使用您返回的修改后的名称使用下面的查询进行调整。这是我建议使用 Win32_GroupUser 类的方法:
Get-WmiObject -ComputerName $Server -Query "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""
为了代替你的功能,它可能看起来像这样:
function Get-LocalAdminGroupMember {
param(
[String] $computerName,
[System.Management.Automation.PSCredential] $credential
)
$params = @{
"ComputerName" = $computerName
"Query" = "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""
}
if ( $credential ) {
if ( $computerName -eq [Net.Dns]::GetHostName() ) {
Write-Warning "The -Credential parameter is ignored for the current computer."
}
else {
$params.Add("Credential", $credential)
}
}
Get-WmiObject @params |
Where{$_.PartComponent -match ':(.+?)\.Domain="(.+?)",Name="(.+?)"'}|
ForEach{
[PSCustomObject]@{
"ComputerName"=$computerName
"Name"='Administrators'
"Member"=$Matches[2..3] -join '\' -replace "^$computerName\\"
"Type"=$Matches[1]
}
}
}
推荐阅读
- node.js - AWS Lambda 无法调用没有 VPC 的另一个 AWS Lambda - NodeJs
- apache-camel - 骆驼并行处理:RouteDefinition 无法转换为 org.apache.camel.model.TryDefinition
- rcpp - 在 Rcpp 函数中停止(作为包的一部分)以调试模式结束
- angular - 如何在点击时将 AutoFocus 指令添加到输入?
- javascript - 如何使用按钮禁用表格行的折叠?
- go - 限制 VS Code for Go 仅下载 v 1.11 的包
- django - 如何用创建后的天数注释查询集
- python - 使用 pip3 命令在 raspberrypi 上安装 pygame 时出错
- sql-server - 通过powershell成功执行SQL脚本后没有得到输出
- sql-server - 使用 443 端口连接到 Azure Sql 服务器