0

我有一个包含以下详细信息的文本文件,因此我需要有关可以将多个 SID 转换为可读用户名的脚本的帮助,但我真的怀疑编码。

使用记事本打开时,基于窗口的权限文件包含如下示例信息

    [/]      
    S-1-5-21-1449722967-1661817991-10773629-12231=rw  
    S-1-5-21-1449722967-1661817991-10773629-15527=rw  

    [AM_ATTG:/]     
    S-1-5-21-1449722967-1661817991-10773629-1207=rw

在这之间,我找到了将 SID 从如何使用 powershell 将 csv 中的 sid 更改为用户的脚本?

因此,我将文件保存到 .csv 中,并将第一列的标题作为用户第二列作为权限

    User                                             Permission
    [/]      
    S-1-5-21-1449722967-1661817991-10773629-12231    rw  
    S-1-5-21-1449722967-1661817991-10773629-15527    rw  

    [AM_ATTG:/]     
    S-1-5-21-1449722967-1661817991-10773629-1207     rw

但是在尝试第一个 powershell 脚本时出现以下错误,非常感谢您对我的帖子的任何提示的回复。

Import-Csv : Cannot process argument because the value of argument "name" is invalid. Change the value of the "name" argument and run the operation again.  
At line:1 char:19
+Import-Csv <<<<  .\sid.csv | ForEach-Object{
+ CategoryInfo          : InvalidArgument: (:) [Import-Csv], PSArgumentException
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.ImportCsvCommand
4

2 回答 2

0

我建议您使 csv 文件看起来像这样(逗号分隔):

Sid,Permission
S-1-5-21-1449722967-1661817991-10773629-12231,rw  
S-1-5-21-1449722967-1661817991-10773629-15527,rw   
S-1-5-21-1449722967-1661817991-10773629-1207,rw

然后你可以这样做:

Import-Csv SID.csv | 
Select-Object Sid,Permission,@{n='User';e={(New-Object System.Security.Principal.SecurityIdentifier $_.Sid).Translate([System.Security.Principal.NTAccount]).Value}}
于 2013-04-09T10:41:10.743 回答
0

VBScript 风格:

sidList = Array( "S-1-5-21-1449722967-1661817991-10773629-12231=rw" _
  , "S-1-5-21-1449722967-1661817991-10773629-15527=rw" _
  , "S-1-5-21-1449722967-1661817991-10773629-1207=rw" _
)

Set wmi = GetObject("winmgmts://./root/cimv2")

For Each sid In sidList
  Set obj = wmi.Get("Win32_SID.SID='" & Replace(sid, "=rw", "") & "'")
  WScript.Echo obj.ReferencedDomainName & "\" & obj.AccountName
Next

更新:您可以将脚本实现为过滤器,如下所示:

Set wmi = GetObject("winmgmts://./root/cimv2")

Do Until WScript.StdIn.AtEndOfStream
  line = Trim(WScript.StdIn.ReadLine)
  If UCase(Left(line, 2)) = "S-" Then
    Set obj = wmi.Get("Win32_SID.SID='" & Replace(sid, "=rw", "") & "'")
    WScript.StdOut.WriteLine obj.ReferencedDomainName & "\" & obj.AccountName
  End If
Loop

像这样运行过滤器:

type input.txt | cscript //NoLogo filter.vbs > output.txt

请注意,您必须使用cscript.exe,否则您将无法访问WScript.StdInor WScript.StdOut

于 2013-04-09T12:48:51.280 回答