首先,我甚至不知道“用户身份”是此处的正确术语。
背景是我正在使用 VisualSVN Server 来管理/管理具有 Windows 身份验证的 SVN 存储库的访问权限,authz-windows
它创建的文件包含 45 个字符长的字符串,而不是“人类可读的”用户或组名。
我需要手动编辑此文件,那么如何找出与特定用户或组相关联的魔术字符串?
答案1
该authz-windows
文件映射 Active Directory 用户和组 SID(objectSid
LDAP 字段)。
但请注意,AD 中此字段的值以十六进制存储,因此您可以使用一些先前的答案确定关联的用户 ID。
(PowerShell 示例在 StackOverflow 上。)
答案2
2016年更新:
升级到最新的 VisualSVN Server 版本。从 VisualSVN Server 3.4 开始,服务器附带了许多 PowerShell cmdlet。其中一些像Get-SvnAccessRule
可以输出为 Active Directory/Windows 用户和组帐户分配的访问规则列表。
以下是在 CSV 文件 AccessReport.csv 中生成访问规则报告的示例:
Get-SvnAccessRule | Select Repository, Path, AccountName, Access | Export-Csv -NoTypeInformation AccessReport.csv
有关 VisualSVN Server PowerShell cmdlet 的完整信息,请阅读文章KB88:VisualSVN 服务器 PowerShell 命令参考。
过时的答案:
我同意宿醉希望以下 VBScript 对您有所帮助。它创建已定义权限的列表,并正确地转换SID有意义且可读域名\用户名。
'
' Print permissions in the form: user_name,path,level
'
strComputer = "."
Set wmi = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\VisualSVN")
Set win = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _
& strComputer & "\root\cimv2")
' Return text representation for the Access Level
Function AccessLevelToText(level)
If level = 0 Then
AccessLevelToText = "No Access"
ElseIf level = 1 Then
AccessLevelToText = "Read Only"
ElseIf level = 2 Then
AccessLevelToText = "Read/Write"
Else
AccessLevelToText = "Unknown"
End If
End Function
' Return repository path for the object
Function GetPath(obj)
cname = assoc.Path_.Class
If cname = "VisualSVN_Service" Then
GetPath = "Repositories Root"
ElseIf cname = "VisualSVN_Repository" Then
GetPath = assoc.Name
ElseIf cname = "VisualSVN_RepositoryEntry" Then
GetPath = assoc.RepositoryName & ": " & assoc.Path
Else
GetPath = "Unknown"
End If
End Function
' Convert SID to user name
Function SidToUserName(sid)
Set account = win.Get("Win32_SID.SID='" & sid & "'")
user = account.AccountName
domain = account.ReferencedDomainName
SidToUserName = domain & "\" & user
End Function
' Return user name associated with account
Function GetAccountName(account)
If account.Path_.Class = "VisualSVN_WindowsAccount" Then
GetAccountName = SidToUserName(account.SID)
Else
GetAccountName = account.Name
End If
End Function
' Iterate over all security descriptions
Set objs = wmi.ExecQuery("SELECT * FROM VisualSVN_SecurityDescriptor")
For Each obj In objs
Set assoc = wmi.Get(obj.AssociatedObject)
For Each perm in obj.Permissions
name = GetAccountName(perm.Account)
level = AccessLevelToText(perm.AccessLevel)
Wscript.Echo name & "," & GetPath(assoc) & "," & level
Next
Next