Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Nocheinmal NetJoinDomain (https://www.delphipraxis.net/10212-nocheinmal-netjoindomain.html)

steppo 13. Okt 2003 20:21


Nocheinmal NetJoinDomain
 
Hi leute,

in der Funktion NetJoinDomain gibt es einen Paramater Namens "FJoinOptions".

gehe ich da richtig in der Annahme, dass es sich um Konstanten handelt?

Habe ich diese Konstanten richtig definiert und zugeordnet?

Die Funktion selber:
Delphi-Quellcode:
function NetJoinDomain(const lpServer: PWChar; const lpDomain:
  PWChar; const lpAccountOU: PWChar; const lpAccount: PWChar; const lpPassword:
  PWChar; const fJoinOptions: DWord): NET_API_STATUS; stdcall; external
'netapi32.dll';
und meine Konstantendefinition:

Delphi-Quellcode:
const
  NETSETUP_JOIN_DOMAIN = 0;
  NETSETUP_ACCT_CREATE = 1;
  NETSETUP_WIN9X_UPGRADE = 2;
  NETSETUP_DOMAIN_JOIN_IF_JOINED = 3;
  NETSETUP_JOIN_UNSECURE = 4;
  NETSETUP_MACHINE_PWD_PASSED = 5;
Hier noch die Beschreibung der einzelnen Konstanten.

fJoinOptions
[in] Specifies a value that contains a set of bit flags defining the join options. This parameter can be one or more of the following values. Value Meaning

NETSETUP_JOIN_DOMAIN Joins the computer to a domain. If this value is not specified, joins the computer to a workgroup.

NETSETUP_ACCT_CREATE Creates the account on the domain.

NETSETUP_WIN9X_UPGRADE The join operation is occurring as part of an upgrade of Windows Me/98/95.

NETSETUP_DOMAIN_JOIN_IF_JOINED Allows a join to a new domain even if the computer is already joined to a domain.

NETSETUP_JOIN_UNSECURE Performs an unsecured join.

NETSETUP_MACHINE_PWD_PASSED Indicates that the lpPassword parameter specifies a local machine account password rather than a user password. This flag is valid only for unsecured joins, which you must indicate by also setting the NETSETUP_JOIN_UNSECURE flag.
If you set this flag, then after the join operation succeeds, the machine password will be set to the value of lpPassword, if that value is a valid machine password.

Die weiter Frage
Kann ich diesen Konstanten einfach die Werte von = 0 bis 5 zuweisen und zwar in der Reihenfolge, wie sie in der Hilfe beschrieben sind?

Christian Seehase 13. Okt 2003 21:22

Re: Nocheinmal NetJoinDomain
 
Moin Steppo,

die genannten Konstanten haben die Werte:

Delphi-Quellcode:
NETSETUP_JOIN_DOMAIN          = $00000001;
NETSETUP_ACCT_CREATE          = $00000002;
NETSETUP_WIN9X_UPGRADE        = $00000010;
NETSETUP_DOMAIN_JOIN_IF_JOINED = $00000020;
NETSETUP_JOIN_UNSECURE        = $00000040;
NETSETUP_MACHINE_PWD_PASSED   = $00000080;
Das ein einfaches durchnummerieren nicht gehen kann kannst Du schon dem Kommentar zum Parameter entnehmen.
Zum einen handelt es sich um Bitflags, zum anderen kann man mehrere kombinieren.
Gerade letzteres wäre aber bei durchnummerierten nicht möglich.

Beispiel, mit Deiner Aufteilung:

NETSETUP_ACCT_CREATE or NETSETUP_WIN9X_UPGRADE = 3 = NETSETUP_DOMAIN_JOIN_IF_JOINED

Fast immer, wenn Du die Beschreibung solcher Konstanten findest wird je Konstante nur ein Bit gesetzt sein, zumindest aber keine Überschneidung zwischen den Bits vorliegen, ausser es handelt sich um Konstanten, die selber schon eine häufige Kombination als eine Konstante zusammenfassen.

Du solltest Dir mal das PSDK herunterladen (hatte ich glaub' ich letztens schon vorgeschlagen ;-)).
Darin sind dann auch, bei entsprechendem Umfang des Downloads, auch die Headerdateien enthalten, denen Du solche Konstanten entnehmen kannst (in diesem Falle die LMJOIN.H)

steppo 13. Okt 2003 21:33

Re: Nocheinmal NetJoinDomain
 
Hi Cristian,
habe mal ein wenig in C++(auf deinen Vorschlag hin) gestöbert.
Da habe ich auch endlich die Beschreibung der Konstanten gefunden, danke.

Die PSDK habe ich schon runtergeladen, aber ich muß mich noch darin zurechtfinden.
Danke für deine Mühe.

mfg
steppo

p.s.:
Du hast recht, durch die Möglichkeit die Parameter zu addieren, fällt das durchnummerieren flach.
Ich werde es beherzigen:
erst denken, dann handeln (fragen).

Christian Seehase 13. Okt 2003 21:41

Re: Nocheinmal NetJoinDomain
 
Moin Steppo,

das ist alles Gewöhnung.
Mit der Zeit hast Du im "Gefühl" was Du wo findest.
Deklarationen z.B. meist in den Headern.

Zitat:

...durch die Möglichkeit die Parameter zu addieren...
Bloss nicht addieren. Immer mit OR verknüpfen.
Wenn Du z.B. eine Kombikonstante nimmst, dann noch eine, die schon in dieser enthalten ist und diese addierst, erhälst Du mit Sicherheit einen völlig falschen Wert.
Verknüpfst Du mit OR kann das nicht passieren.

steppo 14. Okt 2003 17:10

Re: Nocheinmal NetJoinDomain
 
Vielen Dank christian.
Habe das wohl falsch verstanden!
Hatte auch noch einige andere Fehler.
z.B. Das keine vertrauensstellung vorhanden sei.
oder
zu wenig informationen enthalten sind.

habe das Problem aber in den Griff bekommen.
Vielen Dank für deine Hilfe.

Ich verstehe das ganze jedoch immer noch nicht ganz.
Wenn ich "or" sage, gebe ich doch zwei Möglichkeiten zur auswahl.
Es sollen aber doch beide ausgeführt werden!

Christian Seehase 14. Okt 2003 17:47

Re: Nocheinmal NetJoinDomain
 
Moin Steppo,

nein, mit OR werden die Werte binär verknüpft, bei + addiert.

z.B.
Angenommen, Du hast 4 Konstanten. Drei mit Einzelwerten, die kombiniert werden dürfen, und eine, die die ersten beiden Konstanten schon kombiniert, da diese häufig zusammen verwendet werden.
K1 = 1
K2 = 2
K3 = 4
K4 = 3 (Kombinationskonstante)

Jetzt nimmst Du, versehentlich K1, K2 und K4.
Du willst K1 und K2 Kombinieren, hast aber nicht bedacht, oder weisst es nicht, dass K4 das schon erledigen würde

Bei OR wird der Funktion dann der Wert

1 OR 2 OR 3 = 3 übergeben. Alles gut.

Bei + wird dann aber

1 + 2 + 3 = 6 übergeben. Das entspräche dann K2 OR K3. Was auch immer das bedeutet, es war nicht beabsichtigt.

Eine Funktion kann eine so übergebene Funktion dann so auswerten (und wird es auch so oder ähnlich tun):

Delphi-Quellcode:
if (Flags and K1) = K1 then // Berücksichtige Einstellung K1
if (Flags and K2) = K2 then // Berücksichtige Einstellung K2
// usw.
Es werden also beide übergebenen Möglichkeiten erkannt.
Bei einer Addition wäre das nicht gezielt zu zerlegen.

steppo 14. Okt 2003 22:19

Re: Nocheinmal NetJoinDomain
 
hi Christian,
danke für die erklärung.
steppo

CodeX 17. Dez 2004 19:28

Re: Nocheinmal NetJoinDomain
 
ich bin auch gerade dabei eine möglichkeit zu finden, die workgroup/domain am lokalen rechner zu ändern.

Delphi-Quellcode:
function NetJoinDomain(const lpServer: PWChar; const lpDomain:
  PWChar; const lpAccountOU: PWChar; const lpAccount: PWChar; const lpPassword:
  PWChar; const fJoinOptions: DWord): NET_API_STATUS; stdcall; external
'netapi32.dll';
ich habe es mit oben beschriebener funktion versucht. NET_API_STATUS wird als nicht deklariert angegeben.
habe es mal spaßeshalber durch String ersetzt.

siehe da es lässt sich komplilieren. und beim aurufen mit
Delphi-Quellcode:
domainmsg := NetJoinDomain('test',nil,nil,nil,nil,NETSETUP_DOMAIN_JOIN_IF_JOINED);
wird die workgroup auch tatsächlich in 'test' umgeändert. aber leider kommt eine zugriffsverletzung gleich darauf und domainmsg ist immer noch leer.
Code:
access violation at 0012f7c4: write of address 0xf95be744
für was steht denn dieses NET_API_STATUS und wie komm ich da dran?

EDIT
auweia. die fehlermeldung ist ja ein fehlercode. also integer. NET_API_STATUS durch integer ersetzt und schon gehts :)
domainmsg ist nach dem setzen '0' also keine fehlermeldung.

zwei fragen bleiben dann trotzdem noch:
1. was ist NET_API_STATUS und warum ist das sinnvoller als einfach nur 'Integer'?
2. wie komme ich an die fehlercodes von folgenden meldungen ran?
Code:
ERROR_INVALID_PARAMETER A parameter is incorrect.
ERROR_NO_SUCH_DOMAIN The specified domain did not exist.
NERR_SetupAlreadyJoined The computer is already joined to a domain.
NERR_InvalidWorkgroupName The specified workgroup name is not valid.

Christian Seehase 17. Dez 2004 23:48

Re: Nocheinmal NetJoinDomain
 
Moin CodeX,

die Deklarationen kannst Du in den Header Dateien des PSDK finden (Download bei MS, in vollem Umfang ca. 350MB)


Delphi-Quellcode:
const
  // aus LMErr.h
  NERR_BASE                = 2100;
  NERR_SetupAlreadyJoined  = (NERR_BASE+591);
  NERR_InvalidWorkgroupName = (NERR_BASE+595);

  // aus WinError.h
  ERROR_NO_SUCH_DOMAIN   = 1355;
  ERROR_INVALID_PARAMETER = 87;

type
  // aus LMCons.h
  NET_API_STATUS = DWORD;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz