close

取自 http://bubble727.pixnet.net/blog/post/25343591-windows-server-sid-id

SID
也就是安全標識符(Security Identifiers),是標識用戶、組和計算機帳戶的唯一的號碼。在第一次創建該帳戶時,將給網絡上的每一個帳戶發佈一個唯一的 SID。Windows 2000 中的內部進程將引用帳戶的SID 而不是帳戶的用戶或組名。如果創建帳戶,再刪除帳戶,然後使用相同的用戶名創建另一個帳戶,則新帳戶將不具有授權給前一個帳戶的權力或權限,原因是該帳戶具有不同的 SID 號。安全標識符也被稱為安全 ID 或 SID。

SID的作用
用戶通過驗證後,登陸進程會給用戶一個訪問令牌,該令牌相當於用戶訪問系統資源的票證,當用戶試圖訪問系統資源時,將訪問令牌提供給 Windows NT,然後 Windows NT 檢查用戶試圖訪問對像上的訪問控制列表。如果用戶被允許訪問該對象,Windows NT將會分配給用戶適當的訪問權限。
訪問令牌是用戶在通過驗證的時候有登陸進程所提供的,所以改變用戶的權限需要註銷後重新登陸,重新獲取訪問令牌。

SID號碼的組成
如果存在兩個同樣SID的用戶,這兩個帳戶將被鑒別為同一個帳戶,原理上如果帳戶無限制增加的時候,會產生同樣的SID,在通常的情況下SID是唯一的,他由計算機名、當前時間、當前用戶態線程的CPU耗費時間的總和三個參數決定以保證它的唯一性。

一個完整的SID包括:
‧ 用戶和組的安全描述
‧ 48-bit的ID authority
‧ 修訂版本
‧ 可變的驗證值Variable sub-authority values
例:S-1-5-21-310440588-250036847-580389505-500
我們來先分析這個重要的SID。第一項S表示該字符串是SID;第二項是SID的版本號,對於2000來說,這個就是1;然後是標誌符的頒發機構(identifier authority),對於2000內的帳戶,頒發機構就是NT,值是5。然後表示一系列的子頒發機構,前面幾項是標誌域的,最後一個標誌著域內的帳戶和組。

SID的獲得
開始-運行-regedt32-HKEY_LOCAL_MACHINESAMSAMDomainsBuiltinAliasesMembers,找到本地的域的代碼,展開後,得到的就是本地帳號的所有SID列表。
其中很多值都是固定的,比如第一個000001F4(16進制),換算成十進制是500,說明是系統建立的內置管理員帳號administrator,000001F5換算成10進制是501,也就是GUEST帳號了,詳細的參照後面的列表。
這一項默認是system可以完全控制,這也就是為什麼要獲得這個需要一個System的Cmd的Shell的原因了,當然如果權限足夠的話你可以把你要添加的帳號添加進去。
或者使用Support Tools的Reg工具:
reg query "HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionProfileList

還有一種方法可以獲得SID和用戶名稱的對應關係:
1. Regedt32:
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion ProfileList
2. 這個時候可以在左側的窗口看到SID的值,可以在右側的窗口中ProfileImagePath看到不同的SID關聯的用戶名,
比如%SystemDrive%Documents and SettingsAdministrator.momo這個對應的就是本地機器的管理員SID
%SystemDrive%Documents and SettingsAdministrator.domain這個就是對應域的管理員的帳戶

另外微軟的ResourceKit裡面也提供了工具getsid,sysinternals的工具包裡面也有Psgetsid,其實感覺原理都是讀取註冊表的值罷了,就是省了一些事情。

SID重複問題的產生
安裝NT/2000系統的時候,產生了一個唯一的SID,但是當你使用類似Ghost的軟件克隆機器的時候,就會產生不同的機器使用一個SID的問題。產生了很嚴重的安全問題。
同樣,如果是重複的SID對於對等網來說也會產生很多安全方面的問題。在對等網中帳號的基礎是SID加上一個相關的標識符(RID),如果所有的工作站都擁有一樣的SID,每個工作站上產生的第一個帳號都是一樣的,這樣就對用戶本身的文件夾和文件的安全產生了隱患。
這個時候某個人在自己的NTFS分區建立了共享,並且設置了自己可以訪問,但是實際上另外一台機器的SID號碼和這個一樣的用戶此時也是可以訪問這個共享的。

SID重複問題的解決
下面的幾個試驗帶有高危險性,慎用,我已經付出了慘痛的代價!
微軟在ResourceKit裡面提供了一個工具,叫做SYSPREP,這個可以用在克隆一台工作站以前產生一個新的SID號碼。 下圖是他的參數

這個工具在DC上是不能運行這個命令的,否則會提示

但是這個工具並不是把所有的帳戶完全的產生新的SID,而是針對兩個主要的帳戶Administrator和Guest,其他的帳號仍然使用原有的SID。

下面做一個試驗,先獲得目前帳號的SID:
S-1-5-21-2000478354-688789844-839522115
然後運行Sysprep,出現提示窗口:

確定以後需要重啟,然後安裝程序需要重新設置計算機名稱、管理員口令等,但是登陸的時候還是需要輸入原帳號的口令。
進入2000以後,再次查詢SID,得到:
S-1-5-21-759461550-145307086-515799519,發現SID號已經得到了改變,查詢註冊表,發現註冊表已經全部修改了,當然全部修改了。

另外sysinternals公司也提供了類似的工具NTSID,這個到後來才發現是針對NT4的產品,界面如下:

他可不會提示什麼再DC上不能用,接受了就開始,結果導致我的一台DC崩潰,重啟後提示「安全賬號管理器初始化失敗,提供給識別代號頒發機構的值為無效值,錯誤狀態0XC0000084,請按確定,重啟到目錄服務還原模式...」,即使切換到目錄服務還原模式也再也進不去了!
想想自己膽子也夠大的啊,好在是一台額外DC,但是自己用的機器,導致重裝系統半天,重裝軟件N天,所以再次提醒大家,做以上試驗的時候一定要慎重,最好在一台無關緊要的機器上試驗,否則出現問題我不負責哦。另外在Ghost的新版企業版本中的控制台已經加入了修改SID的功能,自己還沒有嘗試,有興趣的朋友可以自己試驗一下,不過從原理上應該都是一樣的。
文章發表之前,又發現了微軟自己提供的一個工具「Riprep」,這個工具主要用做在遠程安裝的過程中,想要同時安裝上應用程序。管理員安裝了一個標準的公司桌面操作系統,並配置好應用軟件和一些桌面設置之後,可以使用Riprep從這個標準的公司桌面系統製作一個Image文件。這個Image文件既包括了客戶化的應用軟件,又把每個桌面系統必須獨佔的安全ID、計算機賬號等刪除了。管理員可以它放到遠程安裝服務器上,供客戶端遠程啟動進行安裝時選用。但是要注意的是這個工具只能在單硬盤、單分區而且是Professional的機器上面用。


下面是SID末尾RID值的列表,括號內為16進制:

Built-In Users
DOMAINNAMEADMINISTRATOR
S-1-5-21-917267712-1342860078-1792151419-500 (=0x1F4)

DOMAINNAMEGUEST
S-1-5-21-917267712-1342860078-1792151419-501 (=0x1F5)
Built-In Global Groups
DOMAINNAMEDOMAIN ADMINS
S-1-5-21-917267712-1342860078-1792151419-512 (=0x200)

DOMAINNAMEDOMAIN USERS
S-1-5-21-917267712-1342860078-1792151419-513 (=0x201)

DOMAINNAMEDOMAIN GUESTS
S-1-5-21-917267712-1342860078-1792151419-514 (=0x202)
Built-In Local Groups
BUILTINADMINISTRATORS S-1-5-32-544 (=0x220)
BUILTINUSERS S-1-5-32-545 (=0x221)
BUILTINGUESTS S-1-5-32-546 (=0x222)
BUILTINACCOUNT OPERATORS S-1-5-32-548 (=0x224)
BUILTINSERVER OPERATORS S-1-5-32-549 (=0x225)
BUILTINPRINT OPERATORS S-1-5-32-550 (=0x226)
BUILTINBACKUP OPERATORS S-1-5-32-551 (=0x227)
BUILTINREPLICATOR S-1-5-32-552 (=0x228)
Special Groups
CREATOR OWNER S-1-3-0
EVERYONE S-1-1-0
NT AUTHORITYNETWORK S-1-5-2
NT AUTHORITYINTERACTIVE S-1-5-4
NT AUTHORITYSYSTEM S-1-5-18
NT AUTHORITYauthenticated users S-1-5-11 *.(over)



http://bbs.csdn.net/topics/60438783

CPUID 取號問題 
http://www.cnblogs.com/cs_net/articles/3387194.html
http://blog.csdn.net/rocky_shared_image/article/details/8058709
電腦資訊 取得問題 

 

  说明:

电脑1(联想品牌电脑);

电脑2(HP品牌电脑);

电脑3(联想品牌电脑);

电脑4(兼容机);

获取CPU编号:
view plaincopy to clipboardprint?
ManagementClass mc = new ManagementClass("Win32_Processor");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
   
 strID = mo.Properties["ProcessorId"].Value.ToString();  
 break;   
             
textBox1.Text +=  "CPU ID:" + strID; 
            ManagementClass mc = new ManagementClass("Win32_Processor");
            ManagementObjectCollection moc = mc.GetInstances();
            string strID = null ; 
            foreach( ManagementObject mo in moc ) 
            
             strID = mo.Properties["ProcessorId"].Value.ToString();
             break;
                      
            textBox1.Text +=  "CPU ID:" + strID;

     返回结果:

        电脑1:CPU ID:BFEBFBFF00000F27

        电脑2:CPU ID:BFEBFBFF00000F27

        电脑3:CPU ID:BFEBFBFF00000F29

        电脑4:CPU ID:BFEBFBFF00000F29

获取主板编号:
view plaincopy to clipboardprint?
ManagementClass mc = new ManagementClass("Win32_BaseBoard");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
   
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
             
textBox1.Text +=  "主板 ID:" + strID; 
            ManagementClass mc = new ManagementClass("Win32_BaseBoard");
            ManagementObjectCollection moc = mc.GetInstances();
            string strID = null ; 
            foreach( ManagementObject mo in moc ) 
            
             strID = mo.Properties["SerialNumber"].Value.ToString();
             break;
                      
            textBox1.Text +=  "主板 ID:" + strID;


      返回结果:

        电脑1:主板 ID:

        电脑2:主板 ID:CN24401483

        电脑3:主板 ID:AZF241001101

        电脑4:主板 ID:


 

获取硬盘编号:
view plaincopy to clipboardprint?
ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");  
//网上有提到,用Win32_DiskDrive,但是用Win32_DiskDrive获得的硬盘信息中并不包含SerialNumber属性。  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
   
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
             
textBox1.Text +=  "硬盘 ID:" + strID; 
            ManagementClass mc = new ManagementClass("Win32_PhysicalMedia");
            //网上有提到,用Win32_DiskDrive,但是用Win32_DiskDrive获得的硬盘信息中并不包含SerialNumber属性。
            ManagementObjectCollection moc = mc.GetInstances();
            string strID = null ; 
            foreach( ManagementObject mo in moc ) 
            
             strID = mo.Properties["SerialNumber"].Value.ToString();
             break;
                      
            textBox1.Text +=  "硬盘 ID:" + strID;


      返回结果:

        电脑1:硬盘 ID:4833395344463658202020202020202020202020

        电脑2:硬盘 ID:WD-WMAJD1092385

        电脑3:硬盘 ID:4a353756354d5939202020202020202020202020

        电脑4:硬盘 ID:0637J2FW508014


获取BIOS编号:
view plaincopy to clipboardprint?
ManagementClass mc = new ManagementClass("Win32_BIOS");  
ManagementObjectCollection moc = mc.GetInstances();  
string strID = null ;    
foreach( ManagementObject mo in moc )    
   
 strID = mo.Properties["SerialNumber"].Value.ToString();  
 break;   
             
textBox1.Text +=  "BIOS ID:" + strID; 
            ManagementClass mc = new ManagementClass("Win32_BIOS");
            ManagementObjectCollection moc = mc.GetInstances();
            string strID = null ; 
            foreach( ManagementObject mo in moc ) 
            
             strID = mo.Properties["SerialNumber"].Value.ToString();
             break;
                      
            textBox1.Text +=  "BIOS ID:" + strID;


     返回结果:

        电脑1:BIOS ID: 

        电脑2:BIOS ID:CN24401483

        电脑3:BIOS ID:

        电脑4:BIOS ID:

 


    总结:

    由以上各步看出,通过Win32_Processor获取CPUID不正确,或者说Win32_Processor字段就不包含CPU编号信息。

    通过Win32_BaseBoard获取主板信息,但不是所有的主板都有编号,或者说不是能获取所有系统主板的编号。

    通过Win32_PhysicalMedia获取硬盘编号应该没有问题。但网上说可以通过Win32_DiskDrive获取,其实所得信息根本不包含SerialNumber。

    通过Win32_BIOS获取BIOS信息,基本和获取主板信息差不多。就是说:不是所有的主板BIOS信息都有编号。


    另外,可以将通过以上各字段所得信息输出,逐个查看所有信息 属性和对应的值。代码如下:

view plaincopy to clipboardprint?
ManagementClass mc = new ManagementClass("Win32_Processor");  
ManagementObjectCollection moc = mc.GetInstances();   
foreach( ManagementObject mo in moc )    
   
 textBox1.Text += "\r\n============CUP信息===========";  
 foreach (PropertyData pd in mo.Properties)  
  
     textBox1.Text += "\r\n" + pd.Name + "\t";  
     if (pd.Value != null)  
      
         textBox1.Text += pd.Value.ToString();  
      
  
 textBox1.Text += "\r\n\r\n=======================";  
 

 

arrow
arrow
    全站熱搜

    丁滿 發表在 痞客邦 留言(0) 人氣()