请问怎么得到系统SID呀,高分送上
解决方案 »
- Tstringlist中存放Record出现奇怪问题
- 有人用kbmMW吗?
- 各位大虾,用SmallStruct结构开发数据库程序,效果怎样? 论坛好像没有人提到过?我想开发一个信息系统,苦于没有一个好的应用框架。
- 判断一个路径是否存?
- 求助:怎样为STRINGGRID和DRAWGRID的某一格设置颜色,并且将焦点放在这一格上!!!!!
- 如何用代码测试adoconnection连接是否可用??
- 再次给分!
- 向各位大虾请教!
- 能不能在控件中调色,而不是用DELPHI本来提供的那写颜色??
- 关于不规则图像的显示与打印问题
- 一个combobox绑定多列数据的方法
- Delphi如何使扫描(或数码摄像)采集图像不显示而送内存?
unit GetSid;interfaceuses
Windows, SysUtils;function GetCurrentUserSid: string;implementationconst
HEAP_ZERO_MEMORY = $00000008;
SID_REVISION = 1; // Current revision leveltype
PTokenUser = ^TTokenUser;
TTokenUser = packed record
User: TSidAndAttributes;
end;function ConvertSid(Sid: PSID; pszSidText: PChar; var dwBufferLen: DWORD): BOOL;
var
psia: PSIDIdentifierAuthority;
dwSubAuthorities: DWORD;
dwSidRev: DWORD;
dwCounter: DWORD;
dwSidSize: DWORD;
begin
Result := False; dwSidRev := SID_REVISION; if not IsValidSid(Sid) then Exit; psia := GetSidIdentifierAuthority(Sid); dwSubAuthorities := GetSidSubAuthorityCount(Sid)^; dwSidSize := (15 + 12 + (12 * dwSubAuthorities) + 1) * SizeOf(Char); if (dwBufferLen < dwSidSize) then
begin
dwBufferLen := dwSidSize;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
Exit;
end; StrFmt(pszSidText, 'S-%u-', [dwSidRev]); if (psia.Value[0] <> 0) or (psia.Value[1] <> 0) then
StrFmt(pszSidText + StrLen(pszSidText),
'0x%.2x%.2x%.2x%.2x%.2x%.2x',
[psia.Value[0], psia.Value[1], psia.Value[2],
psia.Value[3], psia.Value[4], psia.Value[5]])
else
StrFmt(pszSidText + StrLen(pszSidText),
'%u',
[DWORD(psia.Value[5]) +
DWORD(psia.Value[4] shl 8) +
DWORD(psia.Value[3] shl 16) +
DWORD(psia.Value[2] shl 24)]); dwSidSize := StrLen(pszSidText); for dwCounter := 0 to dwSubAuthorities - 1 do
begin
StrFmt(pszSidText + dwSidSize, '-%u',
[GetSidSubAuthority(Sid, dwCounter)^]);
dwSidSize := StrLen(pszSidText);
end; Result := True;
end;function ObtainTextSid(hToken: THandle; pszSid: PChar;
var dwBufferLen: DWORD): BOOL;
var
dwReturnLength: DWORD;
dwTokenUserLength: DWORD;
tic: TTokenInformationClass;
ptu: Pointer;
begin
Result := False;
dwReturnLength := 0;
dwTokenUserLength := 0;
tic := TokenUser;
ptu := nil; if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,
dwReturnLength) then
begin
if GetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
ptu := HeapAlloc(GetProcessHeap, HEAP_ZERO_MEMORY, dwReturnLength);
if ptu = nil then Exit;
dwTokenUserLength := dwReturnLength;
dwReturnLength := 0; if not GetTokenInformation(hToken, tic, ptu, dwTokenUserLength,
dwReturnLength) then Exit;
end
else
Exit;
end; if not ConvertSid((PTokenUser(ptu).User).Sid, pszSid, dwBufferLen) then Exit; if not HeapFree(GetProcessHeap, 0, ptu) then Exit; Result := True;
end;function GetCurrentUserSid: string;
var
hAccessToken: THandle;
bSuccess: BOOL;
dwBufferLen: DWORD;
szSid: array[0..260] of Char;
begin
Result := ''; bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True,
hAccessToken);
if not bSuccess then
begin
if GetLastError = ERROR_NO_TOKEN then
bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY,
hAccessToken);
end;
if bSuccess then
begin
ZeroMemory(@szSid, SizeOf(szSid));
dwBufferLen := SizeOf(szSid); if ObtainTextSid(hAccessToken, szSid, dwBufferLen) then
Result := szSid;
CloseHandle(hAccessToken);
end;
end;end. you can use 'GetCurrentUserSid' to get it
记得给分