有人知道如何将 Windows SDDL 字符串转换为人类可读的格式吗?

问题描述 投票:0回答:1

我最近一直在尝试完成对打印机的审核。

在手动将所有信息放入excel中完成一小部分工作后,我几乎失去了理智,我决定采取不同的方法,学习如何使用powershell来节省时间和精力,并准备一个更准确的并在相当短的时间内清理文档。 我只有一个问题...90% 的信息非常准确,除了 SDDL 字符串,它非常神秘。

我了解到有一种方法可以通过 ConvertFrom-SddlString 函数来翻译它们,但输出仍然缺乏我需要的基本信息:

  • 组或用户名(例如:每个人;John Doe;所有应用程序包;CREATOR OWNER;管理员;等等。)
  • 权限(打印、管理此打印机、管理文档或这些的任意组合)

我试图从 SDDL 字符串实现的输出示例:“[所有人:打印;所有应用程序包:管理文档;创建者所有者:打印、管理文档;AdminY:打印、管理文档、管理此打印机;AdminX:打印,管理这台打印机]”

ConvertFrom-AddlString 似乎缺少一些组,也没有告诉你一些权限。我尝试在 powershell 中手动为 sddl 字符串编写解析器,但作为 powershell 的新手,我发现自己完全迷失了。

我在互联网上搜索了一个可能能够做到这一点的函数或一些代码,但没有成功,而且我们公司内部的编程受到严重限制,所以我无法使用我所知道的任何其他编程语言来帮助我出来了。

有谁知道是否有办法以更可靠/准确的方式翻译 SDDL 字符串?

    $allprintservers = (Get-ADObject -LDAPFilter "(.......)" -properties *|Sort-Object -Unique -Property servername).servername 
    $prntrs = @()
    foreach ($printserver in $allprintservers){
        $pos = $printserver.IndexOf(".")
        $PrintServerName = $printserver.Substring(0, $pos)
        $printers = (Get-Printer -ComputerName $PrintServerName | Where-Object  {$_.Name -notlike "......."}).Name
        foreach ($printer in $printers) {
            if ([string]::IsNullOrWhiteSpace($printer) -or $printer -like "........."){
                $printer = "null"
                break
            }else{
                $currentprinter = Get-Printer -ComputerName $PrintServerName | Where-Object  {$_.Name -like $printer}
                $name = $currentprinter.Name
                $location = $currentprinter.Location
                $comment = $currentprinter.Comment
                $driverName = $currentprinter.DriverName
                $sharedName = $currentprinter.ShareName
                $shared = $currentprinter.Shared
                $portName = $currentprinter.PortName
                $permissions = (Get-Printer -ComputerName $PrintServerName -name $name -Full).PermissionSDDL
                $translation = ConvertFrom-SddlString -sddl $permissions -type ActiveDirectoryRights | Select-Object -ExpandProperty DiscretionaryAcl
                $translation = [string]::join("; ",($translation.Split("`n")))
            }#else
            $prntr = [PSCustomObject]@{
                ServerName = $PrintServerName
                PrinterName = $name
                Location = $location
                Comment = $comment
                DriverName = $driverName
                SharedName = $sharedName
                Shared = $shared
                PortName = $portName
                UnTransACL = $permissions
                TransACL = $translation
            }#printer_CustomObject
            $prntrs += $prntr
        }#Foreach 2nd
    }#foreach 1st
    $prntrs | Export-Csv "..\..\PrinterAudit2022.csv" -Encoding UTF8

我删除了代码中的极少数部分,以避免共享任何敏感信息,但它不应该影响代码的逻辑。

powershell scripting permissions active-directory network-printers
1个回答
0
投票

您好,Stefan,我想知道您是否最终解决了这个问题。最近一直在纠结如何准确读取打印机权限

© www.soinside.com 2019 - 2024. All rights reserved.