gpt4 book ai didi

delphi - 将 SID 转换为名称

转载 作者:行者123 更新时间:2023-12-03 15:42:34 25 4
gpt4 key购买 nike

我的 Delphi 2010 应用程序需要将 Windows 用户添加到本地管理员组。我使用 NetLocalGroupAddMembers 使这部分工作。

现在应用程序需要在具有其他语言的 Windows 本地化版本中运行。为此,我使用 SID 和 LsaLookupSids 函数来获取组的翻译名称,但我无法执行此操作,因为我不知道如何进行 API 调用。

有人可以告诉我如何使用 LsaLookupSids 函数从 SID 获取组名称(美国英语版 Windows 中的“管理员”),我将不胜感激。

以下是我的代码:

function AddUser(const username, password: PChar; resetpassword: boolean): boolean; stdcall;
var
NetApiStatus: NET_API_STATUS;
UserInfo1003: USER_INFO_1003;
UserInfo1005: USER_INFO_1005;
ui: USER_INFO_1;
grp: String;
sid: PSID;
snu: SID_NAME_USE;
sidsize: LongWord;
refdomain: PLsaReferencedDomainList; //array [0..MAX_PATH - 1] of char;
refdomainsize: LongWord;
sidstring: PChar;
lgmi3: _LOCALGROUP_MEMBERS_INFO_3;
reftranname: PLsaTranslatedName;
begin
if UserExists(username) then begin


sidstring := PChar('S-1-5-32-544'); //Local Administrators group

refdomain := AllocMem(SizeOf(refdomain));
FillChar(refdomain, SizeOf(refdomain), 0);

reftranname := AllocMem(SizeOf(reftranname));

sidsize := 0;
sid := nil;
sid := AllocMem(Length(sidstring) );
sid := PChar(sidstring);
try
LsaLookupSids(GetPolicyHandle, 1, sid, refdomain, reftranname);
grp := reftranname^.Name.Buffer;
showmessage('messg ' + grp);
finally
FreeMem(sid, sidsize);
end;
end;

最佳答案

您不需要 LsaLookupSids,这用于查找或 SID 数组。单个 SID 的查找通常使用 LookupAccountSid 完成。示例:

uses JwaWindows; // or JwaSddl, JwaWinBase;
var
Sid: PSID;
peUse: DWORD;
cchDomain: DWORD;
cchName: DWORD;
Name: array of Char;
Domain: array of Char;
begin
Sid := nil;
// First convert String SID to SID
Win32Check(ConvertStringSidToSid(PChar('S-1-5-32-544'), Sid));

cchName := 0;
cchDomain := 0;
// Get Length
if (not LookupAccountSid(nil, Sid, nil, cchName, nil, cchDomain, peUse))
and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
SetLength(Name, cchName);
SetLength(Domain, cchDomain);
if LookupAccountSid(nil, Sid, @Name[0], cchName, @Domain[0], cchDomain, peUse) then
begin
// note: cast to PChar because LookupAccountSid returns zero terminated string
ShowMessageFmt('%s\%s', [PChar(Domain), PChar(Name)]);
end;
end;

if Assigned(Sid) then
LocalFree(DWORD(Sid));

或者使用 Jwscl 更容易:

uses JwsclSid;

var
Sid: TJwSecurityId;
begin
Sid := TJwSecurityId.Create('S-1-5-32-544');
try
ShowMessage(Sid.GetAccountName);
finally
Sid.Free;
end;

关于delphi - 将 SID 转换为名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com