安全性標識碼
Windows 會使用安全性標識碼 (SID) 作為最終值,以區分安全性實體彼此。 例如,系統會將唯一的安全性標識符指派給為系統上個別使用者建立的每個新帳戶。 針對文件系統,只會使用此 SID。
下圖說明安全性標識碼結構。
除了唯一的 SID 之外,Windows 系統也會定義一組已知的標識碼。 例如,本機系統管理員是已知的 SID。
Windows 提供核心內部機制,可在核心環境內的 SID 和使用者名稱之間進行轉換。 這些函式呼叫可從 ksecdd 驅動程式取得,其會使用使用者模式協助程式服務來實作這些函式。 因此,他們在文件系統內的使用必須遵守與使用者模式服務通訊的一般規則。 這些呼叫無法在分頁檔案 I/O 期間使用。
其中一些函式包括:
SecMakeSPN 會建立服務提供者名稱字串,可在與特定安全性服務提供者通訊時使用。
SecMakeSPNEx 是 Windows XP 中引進的 SecMakeSPN 增強版本。
SecMakeSPNEx2 是從 Windows Vista 和 Windows Server 2008 開始提供的增強版 SecMakeSPNEx 。
SecLookupAccountSid 會傳回指定 SID 的帳戶名稱。
SecLookupAccountName 會擷取指定帳戶名稱的 SID。
SecLookupWellKnownSid 會針對指定的已知 SID 類型傳回正確的 SID。 此函式適用於 Windows Server 2003 和更新版本。
此外,任何核心驅動程式都可以使用下列標準運行時間連結庫例程來建立 SID:
RtlInitializeSid 會初始化新 SID 的緩衝區。
RtlLengthSid 會決定儲存在指定緩衝區內的SID大小。
RtlValidSid 會判斷指定的 SID 緩衝區是否為有效的格式化緩衝區。
RtlLengthSid 和 RtlValidSid 假設 SID 的 8 位元組固定標頭存在。 因此,驅動程式應該先檢查 SID 標頭的最小長度,再呼叫這些函式。
雖然還有其他數個 RTL 函式,但此列表會提供建構 SID 時所需的主要函式。
下列程式代碼範例示範如何為「本機系統」實體建立 SID。 您也可以使用 Windows Server 2003 中引進的更簡單 的 SecLookupWellKnownSid 函式。
{
//
// temporary stack-based storage for an SID
//
UCHAR sidBuffer[128];
PISID localSid = (PISID) sidBuffer;
SID_IDENTIFIER_AUTHORITY localSidAuthority =
SECURITY_NT_AUTHORITY;
//
// build the local system SID
//
RtlZeroMemory(sidBuffer, sizeof(sidBuffer));
localSid->Revision = SID_REVISION;
localSid->SubAuthorityCount = 1;
localSid->IdentifierAuthority = localSidAuthority;
localSid->SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
//
// make sure it is valid
//
if (!RtlValidSid(localSid)) {
DbgPrint("no dice - SID is invalid\n");
return(1);
}
}
下列程式代碼範例示範如何使用 “local system” 實體的 SecLookupWellKnownSid 函式來建立 SID :
{
UCHAR sidBuffer[128];
PISID localSid = (PISID) sidBuffer;
SIZE_T sidSize;
status = SecLookupWellKnownSid(WinLocalSid,
&localSid,
sizeof(sidBuffer),
&sidSize);
if (!NT_SUCCESS(status)) {
//
// error handling
//
}
}
雖然後者是慣用的程序代碼,但其中任一種方法都是有效的。 這些程式代碼範例會使用本機緩衝區來儲存 SID。 這些緩衝區無法在目前的呼叫內容之外使用。 如果需要持續性 SID 緩衝區,應該從集區內存配置緩衝區。