![]() |
SID in WinCE nutzen
Hallo zusammen,
ichmuss eine einduetige Identifizierung von PDAs im WLAN in ein programm einbauen. Wenn also jemand einen PDA benutzt wo eine spezielle Software läuft sollen aktionen des Benutzers Gerätebezogen festgehalten werden. Das Programm für WinCe 4.2 (Arm) ist in Lazarus geschrieben. Zuerst dachte ich an auslesen der MAC-Adresse. Da aber die benötigte Unit NB30 benötigt wird und die bei dem WinCE Paket nicht dabei ist such ich nach einer anderen Möglichkeit. Dabei bin ich auf die SID gestoßen. Flux hab ich folgende Unit gefunden
Delphi-Quellcode:
Nur das die SID Datentypen bei mir in WinCe nicht bekannt sind.
(******************************************************************************)
(* SPGetSid - Retrieve the current user's SID in text format *) (* *) (* Copyright (c) 2004 Shorter Path Software *) (* [url]http://www.shorterpath.com[/url] *) (******************************************************************************) { SID is a data structure of variable length that identifies user, group, and computer accounts. Every account on a network is issued a unique SID when the account is first created. Internal processes in Windows refer to an account's SID rather than the account's user or group name. } unit SID; interface uses Windows, SysUtils; function GetCurrentUserSid: string; implementation const HEAP_ZERO_MEMORY = $00000008; SID_REVISION = 1; // Current revision level type 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. Hat da jemand schonmal sowas auf PDA gemacht. Gibt es eine dll die einbinden kann, oder wie läuft das. Gruß Matthias |
Re: SID in WinCE nutzen
1. Bist du sicher, dass du den Quelltext hier so einfach zeigen darfst? (Stichwort: Copyright)
2. Datentypen werden vom Compiler gebraucht und müssen daher für sie definiert werden. Betriebsystem unterstützen keine Datentypen, sondern API Funktionen. Also kann es garnicht sein, dass ein Datentyp SID auf WinCE nicht funktioniert. Entweder verwenden die OS-Funktionen diesen oder nicht. Ich schätze daher, dass die Kompilierung oder die Ausführung einer der Funktionen fehlschlägt?! |
Re: SID in WinCE nutzen
Delphi-Quellcode:
ich hab das wo anders raus kopiert, also entweder hier oder bei den Schweizern, da bin ich mir nicht mehr sicher. Nachdem es schon seit geraumer Zeit im Netz kursiert würde mich da doch jetzt wundern.
1. Bist du sicher, dass du den Quelltext hier so einfach zeigen darfst? (Stichwort: Copyright)
Delphi-Quellcode:
Tschuldigung geht natürlich um Funktionen z.B. IsValidSid
2. Datentypen werden vom Compiler gebraucht und müssen daher für sie definiert werden.
Betriebsystem unterstützen keine Datentypen, sondern API Funktionen. Also kann es garnicht sein, dass ein Datentyp SID auf WinCE nicht funktioniert. Entweder verwenden die OS-Funktionen diesen oder nicht. Ich schätze daher, dass die Kompilierung oder die Ausführung einer der Funktionen fehlschlägt?! |
Re: SID in WinCE nutzen
Welche Symptome kommen denn, wenn du versucht die Funktion zu verwenden?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz