如何將SID在二進位和字符串格式中轉換

2021-01-08 漫漫開發路

今天講SID細節

上一篇中,我們大概了解了DACL的基本概念。今天我們再來看看其中的SID部分。我們的問題是:如何將SID在二進位和字符串格式中進行轉換?

當然,你可以使用Win32API來使用代碼進行轉換,具體就是這兩個API:ConvertSidToStringSid和ConvertStringSidtoSid,但有時候你可能在調試一段內存結構,或者你需要手動地對SID的格式進行轉換,那麼我們就來看看下表:

舉個例子,如果你有一個SDI,值為:S-1-5-21-2127521184-1604012920-1887927527-72713。那麼,它對應的原始16進位值為:010500000000000515000000A065CF7E784B9B5FE77C8770091C0100。

我們按照下表來分解一下:

很好,但是那些數字代表什麼呢?

每臺設備會生成一個唯一ID識別碼,用來對SID進行標記,格式為:(-…-…-…-)。最後一個數字是一個」相對ID(RID)」,用來標誌設備的用戶帳號。實際上,在ntseapi.h頭文件中定義了很多預定義的RID。系統會保留一段(0~999)RID,所以,系統中的第一個非內置帳號會得到1000作為ID。這裡的數字72713表示這個SID是第72714個被創建的SID。(很顯熱,這臺設備是一臺域控制器,用來為成百上千的用戶分配帳號)

可能上面的說法沒那么正確,雖然我說這個是創建的第72714個SID,但是,自某些大型伺服器上,SID可能是不連續的,也即,你不能認為SID是嚴格地連續分配。

總結

系統安全這個主題不是我的專長,所以,上面的信息不一定是完全正確的,但是,我想,應該基本是正確的吧。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關於Windows的小知識,對於廣大Windows平臺開發者來說,確實十分有幫助。本文來自:《How do I convert a SID between binary and string forms?》

相關焦點

  • Python中字符串編碼在二進位之間相互轉換的方法
    第八十節:字符串編碼轉換在學習「計算字符串的長度」(詳見第72節內容Python中如何計算字符串的長度),對編碼的概念、分類和作用,做過一個簡單的介紹,今天的內容,還是從「編碼」開始談。我們知道,機器語言本質上就是0和1組成的二進位語言,所以str和bytes字符在不能拼接的情況下,它們之間的轉換就非常必要了,因為在儲存和傳輸的時候,是必須要將str字符類型轉換為bytes字節類型的。今天就來學習如何str和bytes類型之間轉換的方法。
  • 介紹「十六進位數字符串至數值轉換」函數
    有幾點需要注意:本文引用地址:http://www.eepw.com.cn/article/201701/337016.htm1:雖然該函數的輸入端子「string」的值可以是十六進位數、字符串(ASCII)或其他進位數,但是「string」的值流入該函數中時,先轉換成字符串(ASCII)。
  • LABVIEW編程之時間標識轉換為字符串
    在定時函數選板中,LABVIEW提供了許多的時間類相關函數,包括時間、日期轉換為字符串函數,實際上格式化寫入字符串函數完全支持時間標識,其轉換功能更多、更全面。與數值轉換為字符串類似,時間標識轉換為字符串的關鍵也是格式化字符串,LABVIEW提供了許多專門的時間相關的時間格式代碼,這些格式符不僅僅可以用來轉化為字符串,同時也可以時間標識控制項進行特色顯示,以下的例程中將同時利用字符串和時間標識顯示控制項顯示我們需要的時間日期。
  • 深入剖析go中字符串的編碼問題——特殊字符的string怎麼轉byte?
    我們按照下面的步驟對10000001轉為utf8的二進位序列:第一步:根據x數量對特殊字符的高位補0。x的數量是11,所以需要對特殊字符的高位補3個0,此時特殊字符的二進位表示為:00010000001。
  • BASIC-12十六進位轉換為八進位
    樣例輸入239123ABC樣例輸出714435274【提示】先將十六進位數轉換成某進位數,再由某進位數轉換成八進位。解答:該題思路比較簡單,將輸入的若干16進位數轉換為2進位,再將每三位2進位數轉換為一個八進位數即可。
  • 二進位、十進位、八進位、十六進位間的相互轉換函數
    二進位、十進位、八進位、十六進位間的相互轉換函數1、輸入任意一個十進位的整數,將其分別轉換為二進位、八進位、十六進位。2、程序代碼如下:#include<iostream>using namespace std;int main(){int num;char a[39];//定義一個字符數組
  • C語言常用的進位轉換工具函數盤點!爺爺再也不用擔心我不會進位...
    01 字符串轉十六進位 代碼實現: 04 十進位轉字符串 如果只是單個十進位轉字符串,使用sprintf函數就可以了。 如果是十進位數組:
  • 跟我學解Python題-二進位轉換
    實現:輸入十進位正整數,輸出相應的二進位數字輸入樣例1:6輸出樣例1:110輸入樣例2:27輸出樣例2:11011解題過程:1、新建變量num,用於存儲輸入的十進位數字,num=int(input("請輸入想要轉換的十進位數字(十轉二
  • 二進位求和
    給你兩個二進位字符串,返回它們的和(用二進位表示)。輸入為非空字符串且只包含數字 1 和 0。,其實二進位求和與十進位求和是類似的,十進位求和是遇 10 進 1。二進位求和是遇 2 進 1。我們可以從右往左遍歷二進位數值,然後將每個遍歷到的數據進行相加。就算是十進位數據,我們是從右往左逐位相加。因為逢 2 需要進 1 位。所以 1 + 1 = 2,要轉換為 0。並且將前一位進 1。前一位數據進行相加操作的時候,需要再額外加 1。
  • 在C語言中如何高效地複製和連接字符串?
    但是,如果返回的指針指向第一個字符而不是最後一個字符(或它的下一個字符),NUL結束符的位置會丟失,必須在需要時重新計算。這種做法的低效率可以在將兩個字符串s1和s2連接到目標緩衝區d中的示例中得到說明。
  • 二進位或BCD的轉換電路
    需要對數據做算術運算的系統一般都是採用二進位形式。而要顯示這些結果,就必須將數據轉換為BCD格式。另一方面,來自數碼開關的地址選擇信息則必須轉換為二進位格式,才能用於存儲器尋址操作。本文引用地址:http://www.eepw.com.cn/article/177043.htm對於不需要快速轉換的應用, 用一個可完成兩種轉換的電路就足夠了。圖1 就是此類電路, 它採用加/ 減計數器以獲得所需要的結果。在做二進位/ BCD 轉換時, 二進位計數器中預置二進位值, 並清除BCD 計數器。
  • 漫畫:什麼是字符串匹配算法?
    讓我們來舉一個例子:在上圖中,字符串B是A的子串,B第一次在A中出現的位置下標是2(字符串的首位下標是0),所以返回 2。我們再看另一個例子:在上圖中,字符串B在A中並不存在,所以返回 -1。為了統一概念,在後文中,我們把字符串A稱為主串,把字符串B稱為模式串。
  • 零基礎學Java之數據類型和運算符,第一講:進位及其轉換
    主要內容進位及其轉換標識符、關鍵字常量變量八大基本數據類型final常量和Scanner輸入算術運算符賦值運算符關係運算符邏輯運算符位運算符條件運算符運算符的優先級別基本數據類型的類型轉換學習目標一、進位及其轉換1.1 進位類型十進位:人類使用二進位:計算機使用八進位和十六進位:為了更好的表示二進位
  • JAVA-二進位基礎
    一、二進位的概念計算機進位有:二進位、八進位、十六進位進位的基本特點是:每一位置上的數字必須在0-(進位-1)的範圍內,也就是說二進位只能有0、1;八進位為:0-7;十六進位比較特殊為:0-9,A(10) B(11) C(12) D(13) E(14) F(15)進位轉換:1、非十進位轉換十進位:每位數字乘以進位數的權重次方
  • Java二進位和位運算,這一萬字準能餵飽你
    位運算在日常開發中使用得較少,但是巧妙的使用位運算可以大量減少運行開銷,優化算法。一條語句可能對代碼沒什麼影響,但是在高重複,大數據量的情況下將會節省很多開銷。二進位在了解什麼是位運算之前,十分有必要先科普下二進位的概念。二進位是計算技術中廣泛採用的一種數制。二進位數據是用0和1兩個數碼來表示的數。
  • 10、進位轉換:二進位、八進位、十六進位、十進位之間的轉換
    7×160 = 3751(十進位)將十進位轉換為二進位、八進位、十六進位將十進位轉換為其它進位時比較複雜,整數部分和小數部分的算法不一樣,下面我們分別講解。1) 二進位整數和八進位整數之間的轉換二進位整數轉換為八進位整數時,每三位二進位數字轉換為一位八進位數字,運算的順序是從低位向高位依次進行,高位不足三位用零補齊。下圖演示了如何將二進位整數 1110111100 轉換為八進位:
  • 二進位與十進位如何互相轉換?
    距離考試倒計時11天最近好幾個同學問小楠,二進位與十進位是如何轉換的
  • 程式設計師的情商:二進位電腦能識別,十進位人易懂,十六進位能做啥
    計算機專業的同學,在學習編程中,尤其是初學者,經常有這樣的疑問,一般人只認識十進位(520),電腦只能識別二進位(1000001001),那十六進位(208)能做什麼的?為什麼還要在中間加上一個十六進位呢,是不是多此一舉嗎?本來初學編程,對二進位就不熟悉,要花不少時間和理解來學習理解,在學個十六進位不是很多餘嗎?
  • 從輸入法的全形、半角聊起:計算機的那些字符編碼
    但是二進位的EDVAC卻需要使用二進位「0101」這些數字表示十進位數字,這時計算機就使用了第一種編碼——BCD碼。BCD碼是用4位二進位數來表示十進位數中的0到9這10個數中的任意一位。比如8421 BCD碼0010表示2,0100表示4。那麼什麼是編碼呢?
  • 二進位與八進位互相轉換
    上節課我們學習了二進位轉換十進位,那二進位與常用的八進位之間是如何互相轉換的呢?下面我們先看看二進位與八進位的轉換方法。