DelphiSiWin32

Win32 api funkcije.
Odgovori
fatG
Prispevkov: 494
Pridružen: 22.05.2001 23:14:08

DelphiSiWin32

Odgovor Napisal/-a fatG » 02.12.2007 21:24:17

Daj malo razmisli, kaj govoriš, no.

S tem ko nekaj predlagaš, se seveda avtomatsko vtakneš in hočeš nekaj imeti spremenjeno. Sicer ne bi predlagal.

Kako lahko predlagaš karkoli smiselnega za projekt, v katerem ne sodeluješ in ga niti uporabljaš ne?
No, ta je pa bosa. Samo zato, ker nisem aktivno udeležen, ne smem predlagati, ne da bi to pomenilo mojo željo po spremembi? Torej če vidim nekoga, ki ima kvadratna kolesa, mu ne smem predlagati, da naj si omisli okrogla, čeprav je meni popolnoma vseeno zanj? Se smem "vtikati" (beri: predlagati po mojem mnenju bolj optimalno možnost) le če imam egoističen motiv? Traparija.

Ne mislim se več ubadati s tem. Od vsega začetka je bil moj namen samo konstruktiven predlog, ne pa da zdaj branim svojo pravico do javnega izražanja predloga. Debata pa je "nesmiselna" samo zato, ker pač ne vidiš prednosti, ki jih jaz. Če bi jih, bi predlog upošteval, ali pa bi že prej naredil ustrezne spremembe. Torej v resnici ne gre za nesmiselno debato, temveč samo za razliko v izhodiščih, mnenjih in perspektivah.

lp
you're never too fat to do it

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

DelphiSiWin32

Odgovor Napisal/-a Lee_Nover » 03.12.2007 09:28:32

jaz raje vidim javni read-only SVN dostop kot pa linke do .zip fajlov
potem lahko lepo dodam v nek vecji 'paket' external linke do fajlov, ki jih rabim pa mi z enim Update vse prenese
jaz glasujem za anon readonly public svn dostop :)
.. my 2 c ..
- I hate noobs -

M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

DelphiSiWin32

Odgovor Napisal/-a M.C » 07.12.2007 09:55:57

Jaz bi imel tule noter nekaj takega(no pr men je že :))

Koda: Izberi vse

  

  function DSiTerminateProcessById(AID: Cardinal): boolean;
  var
    HndProcess : THandle;
  begin
    result := false;
    try
      HndProcess := OpenProcess(PROCESS_TERMINATE,TRUE,AID);
      TerminateProcess(HndProcess,0);
    except
      exit;
    end;

    result := true;
  end;
Order is heavens first rule. Therefore some must be better than the rest.

gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

DelphiSiWin32

Odgovor Napisal/-a gabr » 07.12.2007 10:02:23

Ja, šur. Verjetno pa si mora vzeti zadeva prave pravice, če jih še nima? Bom malo pogledal dokumentacijo.

Mimogrede, zakaj 'except'?

Gp

M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

DelphiSiWin32

Odgovor Napisal/-a M.C » 07.12.2007 10:22:13

except je kr tako, sem na hitro vkup zmetal, itak sem računal da boš premetal po svoje, glede pravic pa se nisem obremenjeval ker pr meni kr dela.
Order is heavens first rule. Therefore some must be better than the rest.

gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

DelphiSiWin32

Odgovor Napisal/-a gabr » 14.12.2007 10:58:59

Malo sem šel brskat po MSDN in našel tole lepšo rešitev za zapiranje: http://support.microsoft.com/kb/178893.

Na podlagi iste finte sem zadevo čisto predelal in je zdaj taka:

Koda: Izberi vse

  function DSiSendWMCloseToWindow(hWindow: THandle; lParam: integer): BOOL; stdcall;
  var
    idWindow: DWORD;
  begin
    GetWindowThreadProcessId(hWindow, idWindow);
    if idWindow = DWORD(lParam) then
      PostMessage(hWindow, WM_CLOSE, 0, 0);
    Result := true;
  end; { DSiSendWMCloseToWindow }

  function DSiTerminateProcessById(processID: DWORD; closeWindowsFirst: boolean;
    maxWait_sec: integer): boolean;
  var
    hProcess: THandle;
  begin
    Result := false;
    hProcess := OpenProcess(SYNCHRONIZE OR PROCESS_TERMINATE, false, processID);
    if hProcess = 0 then
      Exit;
    try
      if closeWindowsFirst then begin
        EnumWindows(@DSiSendWMCloseToWindow, integer(processID));
        Result := (WaitForSingleObject(hProcess, maxWait_sec * 1000) = WAIT_OBJECT_0);
      end;
      if not Result then
        Result := TerminateProcess(hProcess, 0);
    finally CloseHandle(hProcess); end;
  end; { DSiTerminateProcessById }
Če v DSiTerminateProcessById za drugi parameter pošlješ True, potem bi se zadeva morala obnašati enako kot tvoja. Malo sem testiral in zadeva kar lepo deluje - tudi aplikacije, ki imajo odprt kakšen dialog, zapre že s pošiljanjem WM_CLOSE (še vedno je pa TerminateProcess za backup).

Comments, anybody?

Gp

gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

DelphiSiWin32

Odgovor Napisal/-a gabr » 15.01.2008 13:31:31

Pomagajte, tovariši!

Tole sem dobil po mailu:
Tale funkcija ne dela pravilno: DSiIsAdmin

Imam stranko, ki ima PC v domeni (XP Pro) in ni Domain-Admin, ampak samo local admin. In funkcija v tem primeru vrne false. In to nekako ni v redu, saj bi clovek pricakoval, da funkcija vrne true, ce je local admin.
Jaz nimam domene, imam samo workgroup :( A bi lahko kdo z domeno in local admin accountom zadevo preveril in če se le da, popravil? Častim pivo ali dve.

Gp

gabr
Prispevkov: 4129
Pridružen: 28.08.2001 14:10:47

DelphiSiWin32

Odgovor Napisal/-a gabr » 15.01.2008 13:44:59

Still need help ...

Obstaja JclSecurity.IsAdministrator, ki preverja neke domenske tokene.

A lahko prosim kdo potrdi, da ta zadeva pravilno dela na domeni, če je user local admin? Potem bi jaz samo ukradel nekaj vrstic iz JCL-jeve kode, in bi delalo pravilno tudi v DSiWin32 ...

Gp

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

DelphiSiWin32

Odgovor Napisal/-a aoven » 15.01.2008 13:55:01

Hm, te funkcije nisem še nikoli uporabil, ampak hiter google-search razkrije, da je verjetno preveč poenostavljena. Poglej tole implementacijo.

Aja: pa žal tudi jaz ne morem preveriti, ker trenutno nimam nobene domene na voljo.

Aleksander
Zadnjič spremenil aoven, dne 15.01.2008 13:56:08, skupaj popravljeno 1 krat.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

DelphiSiWin32

Odgovor Napisal/-a Runner » 15.01.2008 19:19:52

Na žalost je moj server v vzdrževanju, tako da prilagam cel unit od main forma (to je cel test projekt tako ali tako)

Funkcija "IsAdmin" da naslednje rezultate (btw ne spomnim se kje sem dobil kodo, preurejaj po mili volji):

Domenski administrator (seveda tudi domenski admin): TRUE;
Normal domain user (je pa lokalni admin): TRUE;
Lokalni admin (ni pa v domeni): TRUE;
Normal user (ni v domeni): FALSE;

Desktop je del domene drugače (Active Directory domain kontroler, cca 300 users).

Koda: Izberi vse

unit f_Main;

interface

uses
  Windows, SysUtils,  Classes, Controls, Forms, Dialogs, StdCtrls;

type
  TfMain = class(TForm)
    eIsAdmin: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fMain: TfMain;

implementation

{$R *.dfm}

function GetUserFromWindows: string;
var
   UserName : string;
   UserNameLen : Dword;
begin
   UserNameLen := 255;
   SetLength(userName, UserNameLen) ;
   if GetUserName(PChar(UserName), UserNameLen) then
     Result := Copy(UserName,1,UserNameLen - 1)
   else
     Result := 'Unknown';
end;

function IsAdmin: Boolean;
{ -------------------------------------------------------------
  Returns a boolean indicating whether or not user has admin
  privileges. (Call only then running under NT.)

  ------------------------------------------------------------- }
var
  hAccessToken       : tHandle;
  ptgGroups          : pTokenGroups;
  dwInfoBufferSize   : DWORD;
  psidAdministrators : PSID;
  blnResult          : Boolean;            // return flag
  Counter            : Integer;            // counter
const
  SECURITY_NT_AUTHORITY: SID_IDENTIFIER_AUTHORITY = (Value: (0,0,0,0,0,5)); // ntifs
  SECURITY_BUILTIN_DOMAIN_RID: DWORD = $00000020;
  DOMAIN_ALIAS_RID_ADMINS: DWORD = $00000220;
  DOMAIN_ALIAS_RID_USERS : DWORD = $00000221;
  DOMAIN_ALIAS_RID_GUESTS: DWORD = $00000222;
  DOMAIN_ALIAS_RID_POWER_: DWORD = $00000223;

  // buffer size
  SIZE_BUFFER = 1024;

begin
  Result := False;
  blnResult := OpenThreadToken( GetCurrentThread, TOKEN_QUERY,
                                True, hAccessToken );
  if (not blnResult) then
    if GetLastError = ERROR_NO_TOKEN then
      blnResult := OpenProcessToken( GetCurrentProcess, TOKEN_QUERY, hAccessToken );

  if blnResult then
  begin
    GetMem(ptgGroups, SIZE_BUFFER);
    try
      blnResult := GetTokenInformation(hAccessToken,
                                       TokenGroups,
                                       ptgGroups,
                                       SIZE_BUFFER,
                                       dwInfoBufferSize );
      CloseHandle(hAccessToken);

      if blnResult then
      begin

        AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
                                 SECURITY_BUILTIN_DOMAIN_RID,
                                 DOMAIN_ALIAS_RID_ADMINS,
                                 0, 0, 0, 0, 0, 0,
                                 psidAdministrators );
        {$R-}
        for Counter := 0 to ptgGroups.GroupCount - 1 do

          if EqualSid( psidAdministrators, ptgGroups.Groups[Counter].Sid ) then
          begin
            Result := True;
            Break;
          end;
        {$R+}

        FreeSid(psidAdministrators);
      end;
    finally
      FreeMem(ptgGroups);
    end;
  end;
end;

procedure TfMain.FormCreate(Sender: TObject);
begin
  case IsAdmin of
    True: eIsAdmin.Text := Format('%s: is admin', [GetUserFromWindows]);
    False: eIsAdmin.Text := Format('%s: is not admin', [GetUserFromWindows]);
  end;
end;

end.

Odgovori