LogonUser - identyfikacja user/password Windows

0

Hej!
Ogólnie mój problem ogranicza się do poprawnego wpisania zmiennych do funkcji logonuser w WinAPI. Chcę napisać aplikację, która będzie identyfikowała, czy dysponujesz odpowiednim hasłem. Chciałbym, aby była możliwa identyfikacja, czy użytkownik, którego dane zostaną wprowadzone do programu jest administratorem (to jednak nie jest takie ważne). Oprócz tego pozostaje kluczowa kwestia, czy ta funkcja działa pod WinVista/7. Mam więc prośbę, czy mógłby mi ktoś podać dokładnie tę funkcję wraz z zmiennymi? Przepraszam za tego typu pytanie, ale to chyba zrozumiałe, że ktoś może nie mieć pojęcia na ten temat.

0

Mam więc prośbę, czy mógłby mi ktoś podać dokładnie tę funkcję wraz z zmiennymi?

http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v=vs.85).aspx
tu jest dokładnie podane
Ale nie wiem czy można tym sprawdzić czy token jest adminem.

0

No dobrze, to rozumiem, już dawno do tego doszedłem, mam na myśli dokładne wykorzystania funkcji, jakiś przykład. W tym jestem ciemniejszy od czarnej dziury

0

mam na myśli dokładne wykorzystania funkcji, jakiś przykład.

skoro ci MSDN nie wystarczy to proponuje szukanie gotowców albo naukę pascala, bo widać że podstaw nie rozumiesz...

0

Nie chciałem mówić bezpośrednio, ale właśnie poszukuję gotowca. Jestem pewien, że już nigdy w życiu tego nie użyję, więc nie widzę potrzeby dokładniejszej analizy. Jesdnak wszystkie, które dotychczas znalazłem dot. połączeń bezprzewodowych.

0

Rozumiem, że moja wiedza w niektórych dziedzinach może być wybrakowana, ale jako programista-lamer z gimnazjum, który na własną rękę od dwóch lat uczy się programować, gdyż po prostu, nie mam możliwości innej nauki, mam prawo nie być obeznany w niektórych dziedzinach

0

Trochę poczytał, podszkoliłem się. I z helpem i msdn napisałem to:

 procedure TForm2.Button1Click(Sender: TObject);
var aToken : THandle ;

begin
//Check password here, if okay set modal result to mrOk
if LogonUser( PwideChar(widestring(edit1.text)) ,
PwideChar( '.' ),
PwideChar(widestring( maskedit1.Text )),
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT, aToken ) then
begin
edit2.text:='true';
CloseHandle( aToken ) ;
end    ;
end;

Wszystko pięknie, ale przy uruchomieniu procedury:
1007756144f86d7748d71f.png

Jakaś sugestia?

0

Rozumiem, że moja wiedza w niektórych dziedzinach może być wybrakowana, ale jako programista-lamer z gimnazjum, który na własną rękę od dwóch lat uczy się programować, gdyż po prostu, nie mam możliwości innej nauki, mam prawo nie być obeznany w niektórych dziedzinach

Stwierdzanie że jesteś lamerem jest słabą taktyką na zagranie na naszej litości. Ja też tak zaczynałem, i po prostu jak czegoś nie wiedziałem to googlowałem i myślałem i jakimś cudem bardzo rzadko miałem pytania, a jeżeli je już miałem, to zazwyczaj dotyczyły one tego o czym w googlach nie piszą. Więc da się.

Nie chciałem mówić bezpośrednio, ale właśnie poszukuję gotowca.

No i dlatego uznałem że dalsze rozmowy z tobą są bezsensu.

...ale jak widać coś napisałeś...

Jakaś sugestia?

A jakiś błąd? To że wklejasz screena to jest zdecydowanie za mało. Jeżeli wiesz co to debugger, to daj call stacka, miejsce gdzie się zatrzymuje etc etc. A jak nie wiesz co to debugger albo masz jakieś pytania co do niego, to spytaj googla, bo debugger delphi jest bardzo ładnie opisany w wielu tutorialach.

przy okazji, czemu używasz PWideChar skoro moje headery wskazują PChar?
function LogonUser(lpszUsername, lpszDomain, lpszPassword: PChar; dwLogonType, dwLogonProvider: DWORD; var phToken: THandle): BOOL;external 'advapi32' name 'LogonUserA';

0

Widechar zamieniłem na char (choć w kompilatorze wskazywało mi na widechar). Debugger wskazuje wiersz z wskazaniem nazwy usera

0

Widechar zamieniłem na char (choć w kompilatorze wskazywało mi na widechar). Debugger wskazuje wiersz z wskazaniem nazwy usera

No ale powiedzieć czy błąd się zamienił na jaki i jak wygląda kod to już za trudno, prawda? Niestety nie mam kryształowej kuli która mi mówi co myślisz. Ale jeżeli taką masz, to chętnie wezmę.

0

Pisałem, kod taki zam z zamianą na char

 procedure TForm1.Button1Click(Sender: TObject);
var aToken : THandle ;
begin
if LogonUser( PChar((edit1.text)) ,
PChar( '.' ),
PChar(( edit2.Text )),
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT, aToken ) then
begin
edit3.text:='true';
CloseHandle( aToken ) ;
end    ;
end;

kod błędu bez zmian. Zaraz przetestuję też ten program na WinVista.

0

7455789584f86efd790e74.png

Na Vista

0

U mnie działa, po wprowadzeniu poprawnych danych nawet zwraca token.
Powiedz jaki kompilator używasz, może to jest problemem. A jak nie to pewnie system jakoś kopnięty.

0

Delphi XE2, Delphi 7, zaraz sprawdzę lazarusa

0

W Win7 zaczął zwracać taki sam błąd jak w Vista.

0

U mnie pod Lazarusem 0.9.30.4 z FPC 2.6.0 działa bez problemów, program konsolowy z czystym modułem Windows, leciutko przerobione żeby procedurka brała nazwę i hasło. Wszystko pod trybem ansistringów.
Jak ciagle masz problem, to polecam spróbować najpierw przerobić to co dostajesz z VCL/LCL na jakieś stringi, potem zrzutować na PChar i tak użyć bo być może VCL/LCL sobie konwertuje wartość i usuwa zanim wyślesz PChar.

W Win7 zaczął zwracać taki sam błąd jak w Vista.

A musisz pisać jakby to był jakiś chat? To nie jest chat, więc postaraj się pisać WARTOŚCIOWE posty. dziękuję!

0

Nie wiem WTF, ale w Lazarusia wszystko perfectly :)

Cały kod (może się jeszcze komuś przyda)

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, windows;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var aToken : THandle ;
begin
if LogonUser( PChar((edit1.text)) ,
PChar( '.' ),
PChar(( edit2.Text )),
LOGON32_LOGON_NETWORK,
LOGON32_PROVIDER_DEFAULT, aToken ) then
begin
edit3.text:='true';
CloseHandle( aToken ) ;
end    else edit3.text:='false';
end;


end.
                         

A tak w ogóle to wielkie dzięki. Cieszę się, że zrobiłem to względnie samemu. I jeszcze jedna rzecz, ja nie zwracam się na forum z każdym pytaniem, uważając to za ostateczność. Piszę tutaj drugi raz.

0

I jeszcze jedna rzecz, ja nie zwracam się na forum z każdym pytaniem, uważając to za ostateczność. Piszę tutaj drugi raz.

A jeżeli tobie nie zwrócę uwagi to twoje błędy przerodzą się w złe nawyki których nie będziesz świadom. Nie mów mi kiedy mam Ciebie upominać, bo robię to dlatego, aby zachować jakość pytań i odpowiedzi na forum, który ma być niezależnie które to twoje pytanie na forum. Nieznajomość zasad (w tym netykiety i innych niekoniecznie pisanych zasad) nie powoduje wykluczenia z nich.

1 użytkowników online, w tym zalogowanych: 0, gości: 1