【问题标题】:Resolve user name from SID using only local information仅使用本地信息从 SID 解析用户名
【发布时间】:2016-11-08 15:49:54
【问题描述】:

Win32API 函数 LookupAccountSID() 允许解析与 SID 对应的名称。根据文档: LookupAccountSid function

LookupAccountSid 函数尝试通过首先检查已知 SID 的列表来查找指定 SID 的名称。如果提供的 SID 不对应于众所周知的 SID,则该函数会检查内置和管理定义的本地帐户。接下来,该函数检查主域。主域无法识别的安全标识符将根据与其 SID 前缀对应的可信域进行检查。

有没有办法只在本地查找名称?也就是说,如果在调用该函数的 PC 中找不到该名称,则该函数将失败,而不是检查主域。

编辑:明确一点,我想解析非本地用户的名字,而不访问主域(只检查信息是否已经存储在本地)

【问题讨论】:

  • 您可以反转问题:确定 SID 是否为域 SID,如果是,则不要查找。域 SID 是那些以 S-1-5-21 开头然后使用machine SID 作为其域值的 SID。剩下的是内置帐户和本地帐户。免责声明:未经测试。
  • 问题是我想查找本地存储的域用户信息。如果非本地用户在某个时间点登录,即使计算机处于离线状态,LookupAccountSid 也会返回正确的名称。
  • 这由 LSA 缓存管理。没有官方接口。有一些工具可以转储它(如 mimikatz),但这些工具往往是出于黑客目的,大多数网络管理员都不会张开双臂欢迎。您对在域上查找信息的担忧究竟是什么——网络流量发生的事实,查找可能需要很长时间的事实,还有其他什么?您可以简单地通过在本地查找从未超过的一小段时间后取消查找来处理超时。
  • 如果您只想知道哪些域帐户登录了这台机器,最好通过审核和安全事件日志来处理。 LSA 缓存不是可靠的信息来源,对于初学者来说,作为安全措施,可以在机器上完全禁用它。

标签: c# windows powershell sid


【解决方案1】:

不确定这是否是您所追求的,但值得一试:

byte[] sid = // your SID byte array
// Convert SID byte array to readable SID string
var sidString = (new SecurityIdentifier(sid, 0)).Value;
var securityIdentifier = new SecurityIdentifier(sidString);
var identity = securityIdentifier.Translate(typeof(NTAccount)).Value;
// ... identity should be domain\user (string)

【讨论】:

  • 不,当使用本地PC中不存在的域用户的SID时,上面的代码会在主域中查找信息。理想情况下,当使用本地未知的 SID 时,代码不应连接到外部资源。
  • 抱歉,我没办法了 :(
【解决方案2】:

您可以在Win32_UserAccount WMI class 中查询具有相关 SID 的本地帐户 - 如果没有返回任何内容,则该帐户在本地计算机上不存在:

$SID = 'S-1-5-21-510807130-1270608819-2073245338-500'
if($user = Get-WmiObject -Class Win32_UserAccount -Filter  "LocalAccount='True' AND SID = '$SID'")
{
    $user.Name
}

【讨论】:

  • 问题是我想要非本地帐户的信息。使用在某个时间点登录的域用户的 SID 调用 LookUpAccountSid(),即使计算机离线也能成功返回,这表明它存储在缓存中。
猜你喜欢
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2012-10-01
相关资源
最近更新 更多