Hallo zusammen!
Das Thema scheint echt nicht so leicht für mich zu lösen zu sein...
Von einem Programmierer einer Partnerfirma habe ich zwei Codes bekommen, der meinte, dass die Ansätze hier in den Tipps stehen grundsätzlich falsch wären von der Herangehensweise... Mag sein - kann ich leider nicht beurteilen...
Hier die 2 Codes, die ich leider noch nicht in VB.net übersetzen konnte. Ich werde versuchen, ihn dazu noch mal zu bitten, dass zu tun, damit das auch in vb.net läuft...
Prüfen ob überhaupt Admin (2000,XP,Vista...):
function IsAdmin: Boolean;
var
hAccessToken: THandle;
ptgGroups: PTokenGroups;
psidAdministrators: PSID;
x: Integer;
bSuccess: BOOL;
dwLength : DWORD;
begin
Result := False;
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
try
// Get required buffer size and allocate the TOKEN_GROUPS buffer.
if Not Windows.GetTokenInformation( _
hAccessToken,Windows.TokenGroups,ptgGroups,0,dwLength) then begin
if (GetLastError<>ERROR_INSUFFICIENT_BUFFER) then exit;
GetMem(ptgGroups, dwLength);
if ptgGroups=Nil then exit;
end;
bSuccess:=Windows.GetTokenInformation( _
hAccessToken,Windows.TokenGroups,ptgGroups,dwLength,dwLength);
if bSuccess then
begin
AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0, psidAdministrators);
for x := 0 to ptgGroups.GroupCount - 1 do
if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then
begin
Result := True;
Break;
end;
FreeSid(psidAdministrators);
end;
FreeMem(ptgGroups);
finally
CloseHandle(hAccessToken);
end;
end;
end; Prüfen ob voller Admin unter Vista:
function GetProcessIntegrityLevel: TProcessIntegrityLevel;
Var hToken, hProcess: cardinal;
dwLengthNeeded, dwError: cardinal;
pTIL: PTOKEN_MANDATORY_LABEL;
dwIntegrityLevel: dword;
psc: PUCHAR;
sc: Byte;
pil: PDWORD;
begin
Result:=ilNone;
if Win32MajorVersion<=5 then exit; //Erst ab Vista
dwError:=ERROR_SUCCESS;
pTIL:=nil;
hProcess:=GetCurrentProcess;
if OpenProcessToken(hProcess,TOKEN_QUERY or TOKEN_QUERY_SOURCE,hToken) then _
begin
if Not myGetTokenInformation( _
hToken,TokenIntegrityLevel,nil,0,dwLengthNeeded) then begin
dwError:=GetLastError;
if dwError=ERROR_INSUFFICIENT_BUFFER then begin
dwError:=ERROR_SUCCESS;
GetMem(pTIL,dwLengthNeeded);
if pTIL<>nil then begin
if myGetTokenInformation( _
hToken,TokenIntegrityLevel,pTIL,dwLengthNeeded,dwLengthNeeded) _
then begin
dwError:=ERROR_SUCCESS;
psc:=GetSidSubAuthorityCount(pTIL^.mLabel.Sid);
sc:=0;
if psc<>Nil then begin
sc:=psc^-1;
end;
pil:=GetSidSubAuthority(pTIL^.mLabel.Sid,sc);
if pil<>Nil then begin
dwIntegrityLevel:=pil^;
if (dwIntegrityLevel<SECURITY_MANDATORY_MEDIUM_RID) then begin
Result:=ilLow;
end else
if (dwIntegrityLevel>=SECURITY_MANDATORY_MEDIUM_RID) and
(dwIntegrityLevel<SECURITY_MANDATORY_HIGH_RID) then begin
Result:=ilMedium;
end else
if (dwIntegrityLevel>=SECURITY_MANDATORY_HIGH_RID) and
(dwIntegrityLevel<SECURITY_MANDATORY_SYSTEM_RID) then begin
Result:=ilHigh;
end else
if (dwIntegrityLevel>=SECURITY_MANDATORY_SYSTEM_RID) and
(dwIntegrityLevel<SECURITY_MANDATORY_PROTECTED_PROCESS_
_RID) then begin
Result:=ilSystem;
end else
if _
dwIntegrityLevel>=SECURITY_MANDATORY_PROTECTED_PROCESS__
RID then begin
Result:=ilProtected;
end;
end;
end;
end;
end;
end;
end;
end; Im 2. Code das Result:=ilHigh; soll dann aussagen, dass der User alle Adminrechte hat...
Danke für jeden Tipp und wenn dies jemand in vb.net übersetzen kann, dann nur her damit  |