详解SID之终结篇

  今天测试某款监控软件时遇到一个比较棘手的问题,这款软件需要在被监控端安装客户端程序。成功在第一个节点安装好客户端后问题出现了,在其他节点安装时报错无法安装。软件报的错误信息无从下手且系统日志也看不出什么问题,令我百思不得其解。
  中午吃过饭后我一直在考虑问题所在,测试环境使用了虚拟机。在监控机上安装服务器端后在被监控机上安装客户端,这些客户端虚拟机都使用之前装好的系统克隆的。突然我回想起以前遇到过类似的问题,一个虚拟机克隆出几份,将其中一台升级成DC后其他加入域的时候提示“指定域的名称或安全标识SID与该域的信任信息不一致”,最后使用系统支持工具deploy.cab中的sysprep修改系统的sid之后,其他机器可以正常的加入活动目录中。问题就出在域的成员服务器和域控制器不能有相同的SID标识。
  于是我尝试着用sysprep修改了一下其他节点的SID,果然客户端可以正常安装,看来问题即出与此。这样的问题虽然不具有普遍性,但是我已经遇到了两次,还是有必要详细说一下SID这个东西,以便大家遇到类似的问题提供一个思路。

一、对SID的初步认识
  SID即安全标识符(System IDentifier),它用来标识用户身份的。当系统每次创建用户都会分配一个唯一的SID,每个帐户的SID都是不重复的。正因为SID有这样的特性,从Windows 2000以后的W系统对SID的依赖性较高,包括很多系统应用在内的系统内部进程引用帐户的SID而不是帐户的用户名和组名。因为用户的登陆名、显示名和归属的组等都可以修改,将一个帐户删除后再建立一个同名帐户,该账户的SID不同于被删除的那个帐户,所以它也不具有授权给前一个帐户的权利和权限。

二、系统如何使用SID
  当用户通过输入用户名口令得到身份验证(authentication)后,系统内部进程会给用户发放一个访问令牌,其实也就相当于一个票证(ticket)。此后用户访问系统资源时不再需要提供用户名和口令,只需要将访问令牌提供给系统,然后系统检查用户试图访问对象(Resources)上的访问控制列表(ACL)。如果用户被允许访问该对象,系统将会分配给用户相应的访问权限,这也就完成了授权(authorization)的过程。
  上面描述的其实就是一个authentication & authorization的过程,那么如果系统修改了Resources ACL则需要等待ticket过期更换或者用户注销再登陆重新authentication获得新的ticket。
  有关这方面的知识请参考Kerberos协议的技术文档,给大家推荐一篇我看过的文档《关于Kerberos认证原理的对话》,它是麻省理工学院-MIA为了帮助理解Kerberos原理写的一篇对话集,有兴趣的朋友可以看看这段有趣的对话,会对你理解Kerveros协议大有帮助。

三、SID号码如何组成
  例:S-1-5-21-2062728589-3024857285-4110131050-500
  上面着一串是一个标准的SID。第一项S标示该字符串是SID;第二项是SID的版本号,这里版本号是1;第三项十标志符的颁发机构,Win2000之后的颁发机构都是5;最后是一系列资颁发机构前面3组是标志域,最后一组是标志域内的帐户和组。例子中的SID最后一段标志位是500,这代表了它是一个系统内置管理员帐号administrator的SID,又比如最后一段是501的话则是代表GUEST的帐号。有很多内置用户和组的SID相应标志位都是固定的,对应关系这里不再赘述。

四、如何获得用户和主机的SID
1、PsGetSid
  PsGetSid是PsTools工具集中,由sysinternals发布,目前的最新版本是2.44。个人感觉sysinternals的工具功能非常强大也非常好用,如果用好这些工具工作效率大为提高。
下载地址:http://download.sysinternals.com/Files/PsTools.zip 
下面是PsGetSid的描述
PsGetSid
Have you performed a rollout and only to discover that your network might suffer from the SID duplication problem? In order to know which systems have to be assigned a new SID (using a SID updater like Sysinternals' own NewSID) you have to know what a computer's machine SID is. Up until now there's been no way to tell the machine SID without knowing Regedit tricks and exactly where to look in the Registry. PsGetSid makes reading a computer's SID easy, and works across the network so that you can query SIDs remotely. PsGetSid also lets you see the SIDs of user accounts.

Installation
 
Copy PsPsGetSid onto your executable path and type "psgetsid".

Usage
 

Usage: psgetsid [\computer[,computer[,...] | @file [-u username [-p password]]] [account]

 

If you want to see a computer's SID just pass the computer's name as a command-line argument. If you want to see a user's SID, name the account (e.g. "administrator") on the command-line and an optional computer name.

Specify a user name if the account you are running from doesn't have administrative privileges on the computer you want to query. If you don't specify a password as an option PsGetSid will prompt you for one so that you can type it in without having it echoed to the display. 

下面是使用psgetsid查询sid实例
C:Documents and Settingspsyadmin>psgetsid /?

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]


Usage: psgetsid [\computer[,computer2[,...] | @file] [-u Username [-p Password]
]] [account | SID]
     -u         Specifies optional user name for login to
                remote computer.
     -p         Specifies optional password for user name. If you omit this
                you will be prompted to enter a hidden password.
     account    PsGetSid will report the SID for the specified user account
                rather than the computer.
     SID        PsGetSid will report the account for the specified SID.
     computer   Direct PsGetSid to perform the command on the remote
                computer or computers specified. If you omit the computer
                name PsGetSid runs the command on the local system,
                and if you specify a wildcard (\*), PsGetSid runs the
                command on all computers in the current domain.
     @file      PsGetSid will execute the command on each of the computers listed
                in the file.
查询本机sid
C:Documents and Settingspsyadmin>psgetsid

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for \FILESERVER:
S-1-5-21-1665000383-1530267105-3527431458
查询SID对应的主机名
C:Documents and Settingspsyadmin>psgetsid S-1-5-21-1665000383-1530267105-35274
31458

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

Account for FILESERVERS-1-5-21-1665000383-1530267105-3527431458:
Domain: BEACON
查询网络主机SID
C:Documents and Settingspsyadmin>psgetsid \192.168.0.78 -u psyadmin

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

Password:
SID for \192.168.0.78:
S-1-5-21-1214440339-2139871995-839522115
验证口令失败,拒绝访问
C:Documents and Settingspsyadmin>psgetsid \192.168.0.71 -u psyadmin

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

Password:
Couldn't access 192.168.0.71:
拒绝访问。
对方主机防火墙关闭文件和打印机共享,不能连接135端口导致找不到网络路径
C:Documents and Settingspsyadmin>psgetsid \192.168.0.76 -u psyadmin

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

Password:
Couldn't access 192.168.0.76:
找不到网络路径

Make sure that the default admin$ share is enabled on 192.168.0.76.
查询本地用户SID
C:Documents and Settingspsyadmin>psgetsid admin

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for BEACONadmin:
S-1-5-21-1665000383-1530267105-3527431458-1625

2、活动目录环境中查看用户SID
  在活动目录域控制器上regsvr32 acctinfo.dll,活动目录用户和计算机的用户属性中添加"Additional Account Info",显示与账户相关的附加信息。acctinfo.dll包含在Account Lockout Toolkit工具集中(account lockout toolkit工具可以排除比较复杂的账号锁定)

同一个账户admin在图形界面下查询到的SID与使用psgetsid查到的相同。

3、whoami
  为当前登录的用户返回域名、计算机名、用户名、组名、登录标识符以及特权。这个工具可以用来获取本地系统上当前用户(访问令牌)的用户名和组信息,以及相应的安全标识符(SID)、特权和登录标识符(logon ID)。例如,谁是当前登录的用户? 如果没有指定开关,工具用 NTLM 格式(域用户名)显示用户名。
  whoami是一个命令行工具,内核版本是NT 5.2(Windows 2003)之后的Windows系统自带工具。whoami在命令窗口中显示存取令牌(例如,当前用户的安全环境)的完整内容。它显示用户名和安全标识符 (SID)、组名、类型、属性及其 SID、特权及其状态(例如,启用或禁用)以及登录 ID。
语法
whoami {/upn | /fqdn | /logonid}
whoami [{/user | /groups | /priv}] [/fo Format]
whoami /all [/fo Format]

参数
/upn 以用户主体名称 (UPN) 格式显示用户名。 
/fqdn 以完全合格的域名 (FQDN) 格式显示用户名。 
/logonid 显示登录 ID。 
/user 显示当前用户名。 
/groups 显示组名。 
/priv 显示特权。 
/fo Format 指定输出格式。下表列出了有效的 Format 值。 

值 描述 
table 在表格中显示输出。这是默认设置。 
list 在列表中显示输出。 
csv 以逗号分隔 (.csv) 格式显示输出。 

/all 显示当前存取令牌中的活动用户名和组,以及安全标识符 (SID) 和特权。 
/? 在命令提示符下显示帮助。

使用whoami查询
C:Documents and SettingsAdministrator>whoami /all

用户信息
----------------

用户名            SID
================= =============================================
WHOAMIadministrator S-1-5-21-2062728589-3024857285-4110131050-500


组信息
-----------------

组名                             类型   SID          属性

================================ ====== ============ ===========================
===============
Everyone                         已知组 S-1-1-0      必需的组, 启用于默认, 启用的组
BUILTINAdministrators           别名   S-1-5-32-544 必需的组, 启用于默认, 启用的组, 组的所有者
BUILTINUsers                    别名   S-1-5-32-545 必需的组, 启用于默认, 启用的组
NT AUTHORITYINTERACTIVE         已知组 S-1-5-4      必需的组, 启用于默认, 启用的组
NT AUTHORITYAuthenticated Users 已知组 S-1-5-11     必需的组, 启用于默认, 启用的组
NT AUTHORITYThis Organization   已知组 S-1-5-15     必需的组, 启用于默认, 启用的组
LOCAL                            已知组 S-1-2-0      必需的组, 启用于默认, 启用的组
NT AUTHORITYNTLM Authentication 已知组 S-1-5-64-10  必需的组, 启用于默认, 启用的组


特权信息
----------------------

特权名                          描述                       状态
=============================== ========================== ======
SeChangeNotifyPrivilege         跳过遍历检查               已启用
SeSecurityPrivilege             管理审核和安全日志         已禁用
SeBackupPrivilege               备份文件和目录             已禁用
SeRestorePrivilege              还原文件和目录             已禁用
SeSystemtimePrivilege           更改系统时间               已禁用
SeShutdownPrivilege             关闭系统                   已禁用
SeRemoteShutdownPrivilege       从远程系统强制关机         已禁用
SeTakeOwnershipPrivilege        取得文件或其他对象的所有权 已禁用
SeDebugPrivilege                调试程序                   已禁用
SeSystemEnvironmentPrivilege    修改固件环境值             已禁用
SeSystemProfilePrivilege        配置系统性能               已禁用
SeProfileSingleProcessPrivilege 配置单一进程               已禁用
SeIncreaseBasePriorityPrivilege 增加计划优先级             已禁用
SeLoadDriverPrivilege           装载和卸载设备驱动程序     已禁用
SeCreatePagefilePrivilege       创建页面文件               已禁用
SeIncreaseQuotaPrivilege        调整进程的内存配额         已禁用
SeUndockPrivilege               从扩展坞中取出计算机       已禁用
SeManageVolumePrivilege         执行卷维护任务             已禁用
SeImpersonatePrivilege          身份验证后模拟客户端       已启用
SeCreateGlobalPrivilege         创建全局对象               已启用

4、dsget user
  在域控制器上可以用dsget user查看用户的属性信息,但是dsget user需要写全ldap路径,个人比较懒还是用图形界面看比较方便,呵呵。通过dsget user查询到的SID与psgetsid和acctinfo查询到的一致。
C:Documents and Settingspsyadmin>dsget user "CN=admin,OU=domainadmins,DC=beacon,DC=local" -sid
  sid
  S-1-5-21-1665000383-1530267105-3527431458-1625
dsget 成功

5、使用脚本查询SID
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & " ootcimv2")

Set objAccount = objWMIService.Get _
    ("Win32_UserAccount.Name='administrator',Domain='pc0406-09'")
Wscript.Echo objAccount.SID
'("Win32_UserAccount.Name='admin',Domain='beacon'")--查看域beacon.com用户admin的SID号,该script只能在beacon.com域内主机上运行。
'("Win32_UserAccount.Name='administrator',Domain='pc0406-09'")--查看工作组环境下主机pc0406-09上用户administrator的SID号。

6、总结
总结一下上面5种查看的方式,其实说白了都是使用工具或者脚本去读取SAM数据库(活动目录是读取ntds.dit)。大家可以根据实际情况使用。谈完了如何查询SID,那么下面再说说如何修改SID吧。

五、如何修改主机的SID
1、NewSID
  NewSID同样是sysinternals发布的工具 ,最新版本为v4.10,下载地址[url]http://download.sysinternals.com/Files/NewSid.zip[/url]
有关NewSID的技术文档请参考,我不再赘述
[url]http://technet.microsoft.com/zh-cn/sysinternals/bb897418(en-us).aspx[/url]
[url]http://support.microsoft.com/default.aspx?scid=kb;EN-US;314828[/url]
拿一台虚拟机测试一下NewSID的功能吧,首先查看一下该主机的SID
C:Documents and SettingsAdministrator>psgetsid

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for \NEWSID:
S-1-5-21-29509402-4104057432-1482852769
使用NewSID修改SID,sysinternals的工具有一特点,总是在第一次运行的时候搞一个software license term出来。

list出来现在主机的SID,生成的SID一般都要随机生成,就选择"Random SID"。

不修改计算机名了,继续。

生成新的主机SID

对修改SID进行应用

最后完成,需要重启生效。

重启机器之后再次查看SID,与向导中随机生成的SID相同。
C:Documents and SettingsAdministrator>psgetsid

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for \NEWSID:
S-1-5-21-59373167-2686832061-2245549186

2、Sysprep
  Sysprep曾经是Windows Support Tools中DEPLOY.CAB中的一个工具集,最新版本叫做Windows XP Service Pack 3 Deployment Tools,2008年5月14日发布。
下载地址为:http://www.microsoft.com/downloads/details.aspx?FamilyID=673a1019-8e3e-4be0-ac31-70dd21b5afa7&DisplayLang=en

微软官方网站上对它的描述如下,
  Sysprep 是为企业系统管理员、OEM 和需要在多台计算机上部署 Windows XP 的人员设计的工具。在单个计算机上执行初始安装步骤以后,可以运行 Sysprep 准备复制计算机。Sysprep 在第一次重新启动时为每台目标计算机指派唯一的安全标识符 (SID)。Sysprep 将把操作系统配置为当最终用户第一次重新启动计算机时运行欢迎使用 Windows 或最小化安装。这是缩短的 GUI 模式安装,只花费大约 5 到 6 分钟而不是通常的 45 到 60 分钟,并且仅提示最终用户提供必需的和用户特定的信息,例如接受最终用户许可协议 (EULA) 以及输入产品密钥,用户名和公司名。
  即使不使用磁盘复制,Sysprep 也是非常有用的实用程序。可以运行带 -nosidgen 选项的 Sysprep 在单独的计算机上配置“欢迎使用 Windows”或“最小化安装”。在这种情况下,Sysprep 启用附加的审核,自动化“最小化安装”,以便用户能够输入用户特定的信息,例如区域选项和 TAPI 信息,同时跳过创建唯一的 SID 的步骤,因为在计算机上运行安装程序时,SID 已经是唯一的。

  其实我们修改SID只是用到了这个工具集中的sysprep.exe,下面就图示说明如何使用sysprep修改SID。
首先查看主机SID
C:Documents and SettingsAdministrator>psgetsid

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for \SYSPREP:
S-1-5-21-29509402-4104057432-1482852769
然后运行sysprep.exe,照例有一个terms信息,略过。

按照提示选择"工厂",系统将关机。

重新开启主机,出现系统自动重新部署的画面。

这个过程很快,进入系统之后查看主机SID,已经被修改。
C:Documents and SettingsAdministrator>psgetsid

PsGetSid v1.43 - Translates SIDs to names and vice versa
Copyright (C) 1999-2006 Mark Russinovich
Sysinternals - [url]www.sysinternals.com[/url]

SID for \SYSPREP:
S-1-5-21-1216658550-2598232002-216654985




这里还有一篇赛门铁克的技术文档How to change the SID on a Windows XP, Windows 2000, or Windows NT computer,大家可以参阅一下。
网址:http://service1.symantec.com/SUPPORT/on-technology.nsf/docid/1999050308324125

除了以上谈到的技术细节了工具之外,SID重复也同样会引发很多严重的问题,我会后续补上。

写这个文档花了我整整2天的时间,包括查阅资料,软件测试和整理文档。呵呵,都已经凌晨了,要睡了。希望这篇文档对大家有帮助。

出处:http://beacon.blog.51cto.com/442731/116217

原文地址:https://www.cnblogs.com/mq0036/p/3518553.html