Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo,
seinerzeit habe ich den Fehler wegbekommen, aber ich weiß nicht mehr wie. Da ich hier kein ADS habe, kann ich auch nicht ausprobieren, wie das damals wohl war. Bau Dir für die Zugriffe jeweils Methoden, wie Deinen Dummy, und übergibt den Methoden die Werte als Const-Parameter. Als Rückgabe immer einen Boolean verwenden, mit dem Du den Erfolg abprüfen kannst. Deine bisherigen Beschreibungen erwecken bei mir den Eindruck, als würde nach dem Zugriff mit ADSObject die im Formular genutzten Komponenten zerschossen. Also diese nicht nutzen, Variabeln "zwischenschalten" und ADS-Zugriffe in eigenen Methoden packen. Klingt erstmal aufwändig, aber mir fällt da nix besseres ein. |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Moin, Moin
warum passiert es hier? Zitat:
mehr gebraucht werden(aus Sicht des Interface). Beispiel:
Delphi-Quellcode:
Egal ob der Aufruf erfolgreich war oder nicht, sContainerPath wird aus Sicht des Interfaces nicht mehr
...
sContainerPath := EdContainerPath.Text; if AdsMgr.ADSObject.MoveTo(ADSPATH_OF_CURRENT_USER, sContainerPath) then txt := '- Benutzer wurde erfolgreich nach "'+sContainerPath+'" verschoben.' // <--- ZUGRIFFSVERLETZUNG !!! ... benötigt, deshalb die Zugriffsverletzung. Ein:
Delphi-Quellcode:
wird jedoch funktionieren, da ja mit EdContainerPath.Text weiter gearbeitet wird.
...
sContainerPath := EdContainerPath.Text; if AdsMgr.ADSObject.MoveTo(ADSPATH_OF_CURRENT_USER, sContainerPath) then txt := '- Benutzer wurde erfolgreich nach "'+ EdContainerPath.Text +'" verschoben.' ... Es gibt in diesem Zusammenhang noch einige andere Ungereimtheiten, die ich jetzt nicht erklären kann, da ich keine Zugriff auf meine Dateien/Projekte habe(die liegen zu Hause). Also notfalls noch einmal melden. Bis Bald |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo,
Zitat:
Das heißt aber doch, für jeden Zugriff mit ADSObject mache man sich die entsprechende Variabel, weise ihr den entsprechenden Wert zu und greife nachher nie mehr auf diese Variabel zu. Das passt auch auf die Lösung, an die ich mich zu erinnern glaube. |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
Delphi-Quellcode:
txt := '- Benutzer wurde erfolgreich nach "'+ EdContainerPath.Text +'" verschoben.'
Zitat:
|
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo,
wie wäre es mit
Delphi-Quellcode:
und
function TFrameUsers.ChangeAccountName(const sAccountName : String): Boolean;
begin result := AdsMgr.ADSUsers.ChangeAccountName(ADSPATH_OF_CURRENT_USER, sAccountName); end;
Delphi-Quellcode:
Wenn das auch nicht geht, dann ziehe ich mich aus dem Thema zurück und will nie mehr was mit ADS zu tuen haben ;-)
...
if ChangeAccountName(EdContainerPath.Text) then begin txt := '- Benutzer wurde erfolgreich nach "'+ EdContainerPath.Text +'" verschoben.'; end else begin txt := '- Benutzer konnte nicht nach "'+ EdContainerPath.Text +'" verschoben werden.'; end; ... |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Zitat:
|
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo,
Alter Mann schreibt aber oben in diesem Zusammenhang, warum die Krücke gebraucht wird. Wer jetzt letztlich "Schuld" an dem Dilemma ist, keine Ahnung :-( |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hi...
1. Dann ist also die Lösung: eine Dummy Funktion zu verwenden?! 2. Und warum funktioniert die Dummy Funktion und das Workaround mit den Variablen klappt nicht? 3. Ist das jetzt nur bei Delphi so, oder hat man das Problem auch mit einer anderen Entwicklungsumgebung/Sprache? |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hallo,
Zitat:
2. Weil (vermutlich) bei der Dummyfunktion nur die in ihr verwendeten Variabeln zerschossen werden, es geht wohl nur innerhalb der Funktion was kaputt und die Aussenwelt bleibt unberührt. Ohne die Dummyfunktion übernimmt wohl quasi die Funktion, in der der Aufruf stattfindet, den "Kaputtgehpart" der Dummyfunktion. 3. Kann ich nichts zu sagen, kenne nur Delphi ;-) |
Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n
Hmm super, da hab ich mich schon halbers mit den "DummyFunktionen" abgefunden, da tritt folgendes Phänomen auf:
Diese Funktion endet stets in einer Zugriffsverletung:
Delphi-Quellcode:
Diese nicht!!!!!!!!!!!!!
{******************************************************************************}
// UI: SAVE USER INFORMATION AFTER EDITING {******************************************************************************} procedure TFrameUsers.BtnSaveClick(Sender: TObject); var txt: String; begin txt := ''; // CHANGE SAMACCOUNTNAME if sEditedFields.IndexOf('EdSAMAccountName') > -1 then begin if ChangeAccountName then txt := '- Kontoname wurde auf "'+EdSAMAccountName.Text+'" geändert.' + #13 else txt := '<!> Kontoname konnte nicht geändert werden <!>' + #13; end; // CHANGE DESCRIPTION if sEditedFields.IndexOf('EdDescription') > -1 then // <<<<<<<<<<<<<<<<<<< ZUGRIFFSVERLETZUNG begin if ChangeDescription then txt := txt + '- Beschreibung wurde erfolgreich geändert.' + #13 else txt := txt + '<!> Beschreibung wurde nicht geändert <!>.' + #13; end; // CHANGE NAMES if (sEditedFields.IndexOf('EdLastName') > -1) or (sEditedFields.IndexOf('EdFirstName') > -1) then begin if ChangeNames then begin txt := txt + '- Benutzer heisst jetzt "'+EdLastName.Text+' '+EdFirstName.Text+'"' + #13; if ChangeCN then txt := txt + ' - CN wurde ebenfalls auf "'+EdLastName.Text+' '+EdFirstName.Text+'" geändert. ' + #13 else txt := txt + ' <!> CN konnte nicht geändert werden <!>' + #13; end else txt := txt + '<!> Benutzername konnte nicht geändert werden <!>' + #13; end; // MOVE USER if sEditedFields.IndexOf('EdContainerPath') > -1 then begin if MoveUser then txt := txt + '- Benutzer wurde erfolgreich nach "'+EdContainerPath.Text+'" verschoben.' + #13 else txt := txt + '<!> Benutzer konnte nicht verschoben werden <!>' + #13; end; // FINALIZE if txt = '' then begin txt := 'Sie haben keine Änderungen vorgenommen.'+#13+'Wenn Sie nichts ändern wollen, klicken Sie auf abbrechen.'; ShowMessage(txt); end else begin ShowMessage(txt); FreeAndNil(sEditedFields); ShowFrame(mdDontClearFields); end; end;
Delphi-Quellcode:
)=+"?ç(+&"ç+"()*(+"(*ç/ Was ist denn jetzt schon wieder?! Wie ihr bemerkt habt, verwende ich nur in der ersten if abfrage mein "kopiertes" Objekt sEditedFields' und das klappt schon.
{******************************************************************************}
// UI: SAVE USER INFORMATION AFTER EDITING {******************************************************************************} procedure TFrameUsers.BtnSaveClick(Sender: TObject); var txt: String; sf: TStringList; begin txt := ''; sf := sEditedFields; // CHANGE SAMACCOUNTNAME if sf.IndexOf('EdSAMAccountName') > -1 then begin if ChangeAccountName then txt := '- Kontoname wurde auf "'+EdSAMAccountName.Text+'" geändert.' + #13 else txt := '<!> Kontoname konnte nicht geändert werden <!>' + #13; end; // CHANGE DESCRIPTION if sEditedFields.IndexOf('EdDescription') > -1 then begin if ChangeDescription then txt := txt + '- Beschreibung wurde erfolgreich geändert.' + #13 else txt := txt + '<!> Beschreibung wurde nicht geändert <!>.' + #13; end; // CHANGE NAMES if (sEditedFields.IndexOf('EdLastName') > -1) or (sEditedFields.IndexOf('EdFirstName') > -1) then begin if ChangeNames then begin txt := txt + '- Benutzer heisst jetzt "'+EdLastName.Text+' '+EdFirstName.Text+'"' + #13; if ChangeCN then txt := txt + ' - CN wurde ebenfalls auf "'+EdLastName.Text+' '+EdFirstName.Text+'" geändert. ' + #13 else txt := txt + ' <!> CN konnte nicht geändert werden <!>' + #13; end else txt := txt + '<!> Benutzername konnte nicht geändert werden <!>' + #13; end; // MOVE USER if sEditedFields.IndexOf('EdContainerPath') > -1 then begin if MoveUser then txt := txt + '- Benutzer wurde erfolgreich nach "'+EdContainerPath.Text+'" verschoben.' + #13 else txt := txt + '<!> Benutzer konnte nicht verschoben werden <!>' + #13; end; // FINALIZE if txt = '' then begin txt := 'Sie haben keine Änderungen vorgenommen.'+#13+'Wenn Sie nichts ändern wollen, klicken Sie auf abbrechen.'; ShowMessage(txt); end else begin ShowMessage(txt); FreeAndNil(sEditedFields); ShowFrame(mdDontClearFields); end; end; Wenn ich allerdings wie in der ersten Funktion sEditedFields verwende, gibts ne schreeeecklicke Zugriffsverletzung! Für den Test änderte ich immer nur den sAMAccountName und die Beschreibung, dann tritt die Zugriffsverletung an der markierten Stelle. Ich meine: Es scheint irgendwie meine StringList "sEditedFields" zu zerstören, nur wie und warum, die gebe ich ja nirgens an eine Funktion weiter die ADSGetObject oder so aufruft, woher die Zerstörungswut???? Ich glaub ich kündige :cry: PS: Hier noch die Dummy Functions:
Delphi-Quellcode:
{******************************************************************************}
// MOVE USER [DUMMY FUNCTION] {******************************************************************************} function TFrameUsers.MoveUser: Boolean; begin result := AdsMgr.ADSObject.MoveTo(ADSPATH_OF_CURRENT_USER, EdContainerPath.Text); end; {******************************************************************************} // CHANGE ACCOUNT NAME [DUMMY FUNCTION] {******************************************************************************} function TFrameUsers.ChangeAccountName: Boolean; begin result := AdsMgr.ADSUsers.ChangeAccountName(ADSPATH_OF_CURRENT_USER, EdSAMAccountName.Text); end; {******************************************************************************} // CHANGE NAMES [DUMMY FUNCTION] {******************************************************************************} function TFrameUsers.ChangeNames; begin result := AdsMgr.ADSUsers.ChangeNames(ADSPATH_OF_CURRENT_USER, EdFirstName.Text, EdLastName.Text); end; {******************************************************************************} // CHANGE USERS CN [DUMMY FUNCTION] {******************************************************************************} function TFrameUsers.ChangeCN; begin result := AdsMgr.ADSUsers.ChangeCN(ADSPATH_OF_CURRENT_USER, EdFirstName.Text+' '+EdLastName.Text); end; {******************************************************************************} // CHANGE USERS DESCRIPTION [DUMMY FUNCTION] {******************************************************************************} function TFrameUsers.ChangeDescription; begin result := AdsMgr.ADSUsers.ChangeDescription(ADSPATH_OF_CURRENT_USER, EdDescription.Text); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 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