【问题标题】:Changing CSV report entry if duplicates exist with powershell如果 powershell 存在重复项,则更改 CSV 报告条目
【发布时间】:2017-08-28 18:42:13
【问题描述】:

我对 powershell 还很陌生,所以我会尽力解释自己。我目前正在使用一个脚本,该脚本为服务器上的所有用户和用户组创建访问级别的 csv 报告。在管理员和用户权限之间分解。目前,它为同时具有管理员和用户访问权限的组提供了两个条目。类似于下图。 (由于在 stackoverflow 上创建表格存在一些问题,因此以图片形式发布)

我希望就如何将报告中重复的用户/组合并到一个条目中提供一些建议,并在两个字段中都带有 X。类似于以下内容:

这是我当前的脚本:

 [CmdletBinding()]
Param(
    [Parameter(    ValueFromPipeline=$true,
                ValueFromPipelineByPropertyName=$true
                )]
    [string[]]
    $ComputerName = $env:ComputerName,

    [Parameter()]
    [array] $LocalGroupNames = @("Administrators", "Remote Desktop Users"),

    [Parameter()]
    [string]
    $LocalGroupName,

    [Parameter()]
    [string]
    $OutputDir = "c:\temp"
)

Begin {
    $OutputFile = Join-Path $OutputDir "OSUsers $(get-date -f yyyy-MM-dd).csv"
    Add-Content -Path $OutPutFile -Value "ServerName, User\Group, Administrator, User"
    }

Process {
    ForEach($Computer in $ComputerName) {
        foreach ($LocalGroupName in $LocalGroupNames) {
        Write-host "Working on $Computer"
        If(!(Test-Connection -ComputerName $Computer -Count 1 -Quiet)) {
            Add-Content -Path $OutputFile -Value "$Computer,Offline,Offline,Offline"
            Continue
        } else {
            Write-Verbose "Working on $computer"
            try {
                $group = [ADSI]"WinNT://$Computer/$LocalGroupName"
                $members = @($group.Invoke("Members"))
                Write-Verbose "Successfully queries the members of $computer"
                if(!$members) {
                    Add-Content -Path $OutputFile -Value "$Computer,NoMembersFound"
                    Write-Verbose "No members found in the group"
                    continue
                }
            }        
            catch {
                Add-Content -Path $OutputFile -Value "$Computer,FailedToQuery"
                Continue
            }
            foreach($member in $members) {
                try {
                    $MemberName = $member.GetType().Invokemember("Name","GetProperty",$null,$member,$null)
                    $MemberType = $member.GetType().Invokemember("Class","GetProperty",$null,$member,$null)
                    $MemberPath = $member.GetType().Invokemember("ADSPath","GetProperty",$null,$member,$null)
                    $MemberDomain = $null
                    if($MemberPath -match "^Winnt\:\/\/(?<domainName>\S+)\/(?<CompName>\S+)\/") {
                        if($MemberType -eq "User") {
                            $MemberType = "LocalUser"
                        } elseif($MemberType -eq "Group"){
                            $MemberType = "LocalGroup"
                        }
                        $MemberDomain = $matches["CompName"]

                    } elseif($MemberPath -match "^WinNT\:\/\/(?<domainname>\S+)/") {
                        if($MemberType -eq "User") {
                            $MemberType = "DomainUser"
                        } elseif($MemberType -eq "Group"){
                            $MemberType = "DomainGroup"
                        }
                        $MemberDomain = $matches["domainname"]

                    } else {
                        $MemberType = "Unknown"     
                        $MemberDomain = "Unknown"
                    }
                if ($MemberType -ne "Unknown") ##Exclude unresolved users
                {
                    if ($LocalGroupName -eq "Administrators")
                    {Add-Content -Path $OutPutFile -Value "$Computer, $MemberName, X, ,"}
                    if ($LocalGroupName -eq "Remote Desktop Users")
                    {Add-Content -Path $OutPutFile -Value "$Computer, $MemberName, , X,"}
                }
                } catch 
                {
                    Add-Content -Path $OutputFile -Value "$Computer, ,FailedQueryMember"
                } 
                }

            } 
        }

    }
}
End {}

【问题讨论】:

  • 在请其他人为您工作之前,您是否尝试过做任何事情?
  • 我已经做了相当多的搜索来寻找允许我这样做的模块或函数。我在想使用“-unique”会起作用,但我需要能够将“X”添加到用户/组,其中唯一似乎只是删除重复的用户/组。
  • 我只是在寻找可以为我指明正确方向的建议。我可以做我自己的工作。 :)
  • 请注意,这是我第一次在 stackoverflow 上发帖,我不确定我应该在帖子中包含多少细节。我有一个正常运行的脚本,这只是我希望实现的最后一步。我愿意接受有关如何提高这篇文章质量或提供脚本的建议。

标签: powershell csv duplicates


【解决方案1】:

您可能想要在此处获取管理员和远程桌面用户的成员,然后使用 foreach 语句检查每个用户是否存在于两个组中的结果。

Compare-Object 在这里也可能是您的朋友,因为您可以确定如何处理写入文件的内容。如果您使用 -IncludeEqual 参数,该命令将输出“”或“==”。

例如:

Powershell - find items which are in array1 but NOT in array2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2017-06-17
    • 2011-11-05
    • 2019-10-17
    • 2012-12-13
    • 2010-10-16
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多