【问题标题】:Script to convert multiple SID to readable username将多个 SID 转换为可读用户名的脚本
【发布时间】:2013-04-09 10:00:32
【问题描述】:

我有一个包含以下详细信息的文本文件,因此我需要有关可以将多个 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 从How can I use powershell to change sid in csv to user? 转换的脚本

因此,我将文件保存到 .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

【问题讨论】:

  • 删除 .csv 文件中每个 SID 值的结尾“rw”。

标签: powershell vbscript


【解决方案1】:

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.StdInWScript.StdOut

【讨论】:

  • 其实我更喜欢VBscript,但是我有2000++ SID要转换,文件原本是文本格式,包含如上信息(AccessPathName代表SID格式的用户拥有的存储库路径访问,在=之后是权限级别),保存在.csv中进行转换会更容易吗?
  • 我运行这个命令:type input.txt | cscript // vb3.vbs > output.txt 但我得到的空输出为 Microsoft (R) Windows Script Host Version 5.8 版权所有 (C) Microsoft Corporation。版权所有。 \ \ \ \ \ \ \ \
  • 本地计算机或计算机域中的 SID 未知。
【解决方案2】:

我建议你让 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}}

【讨论】:

  • 我已经尝试删除列权限并在运行时删除,但没有任何反应,通过 powershell 执行时也没有错误显示。
  • 我的帖子可能不清楚,但我尝试删除指示权限的列或在运行时删除它们但没有任何反应,通过 powershell 执行时也没有错误显示。原始 .csv 保存到 2 列中,如下所示
    user Permission
    S-1-5-21- 1449722967-1661817991-10773629-15527 rw
  • 仅将 SID 值放入 csv 文件中的 AccessPathName 标头下,然后尝试我的示例。您的示例显示了 CSV 的用法,最后一条评论显示了 HTML 标记。
  • 非常感谢您的帮助。我有2000++ SID要转换,文件原本是文本格式,包含如上信息(AccessPathName,我用SID格式表示用户可以访问的存储库路径,=之后是权限级别)。我已将上述文件保存到 .csv 中,并将 SID 的列标题更改为 AccessPathName 作为您的评论,但在运行脚本、脚本导入 .csv 文件以及结果如何之后仍然没有任何内容?它可以在 .csv 文件中导出输出,并在 SID 列替换可读的用户名吗?
  • 您能否使用示例 CSV 内容更新您的问题?这将极大地帮助我和其他人帮助你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多