View Full Version : API Call mit external SQL Procedure
Hallo,
für unser Anwendungsmodernisierungsprojekt benötige ich die Möglichkeit, aus einer C# Anwendung heraus das Kennwort des eigenen Benutzerprofils zu ändern, sei es weil es abgelaufen ist oder der Anwender von sich aus ändern möchte. Als notwendigen Wrapper, wollte ich eine SQL-Prozedur verwenden.
Seitens API habe ich die QSYCHGPW u. ihre Definition gefunden und mich dann an einer external SQL Procedure versucht.(https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/QSYCHGPW.htm)
-- Erstellen 'QSYS/QSYCHGPW'
CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), INOUT ErrorCode CHAR(15))
LANGUAGE C MODIFIES SQL DATA
EXTERNAL NAME 'QSYS/QSYCHGPW'
PARAMETER STYLE GENERAL;
-- CALL
CALL ChgPwd('MEINUSR', 'PWALT', 'PWNEU', '');
Leider ohne Erfolg. Ebenso habe ich die optionale Parametergruppe als Parameter implementiert u. diverse Versuche unternommen - letztendlich alle ohne Erfolg. Einen konkrete Verdacht habe ich nicht, lediglich die Vermutung, dass es evtl. am letzten Parameter oder den optionalen liegen könnte.
Eine SQL Prozedur für den Aufruf der QSYS2.QCMDEXC analog dazu hat funktioniert, jedoch existieren hier nur IN-Parameter.
Den Hinweis zu den External SQL Procedures habe ich u.a. im folgenden gefunden:
http://www-01.ibm.com/support/docview.wss?uid=nas8N1017493
Die Frage ist auch, ob es über meinen Weg funktionieren kann, oder ich ein RPGLE dafür schreiben müsste (in Anlehnung an: http://www-01.ibm.com/support/docview.wss?uid=nas8N1014053 oder http://www.code400.com/forum/forum/tips-techniques-tools-announcements/tips-for-the-iseries-as400/1874-api-s-qsychgpw-qwcrsval)
andreaspr@aon.at
17-01-18, 09:33
Hallo,
Die Blanks sind hier wichtig:
CALL ChgPwd('MEINUSR ', 'PWALT ', 'PWNEU ', '');
So funktioniert es zumindest bei mir.
Wobei ich für testzwecke den IN/OUT Parameter in IN umgeändert habe, damit ich kein PGM schreiben muss:
CREATE OR replace PROCEDURE pranlib.ChgPwd
(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), IN ErrorCode CHAR(15))
Hoffe das Hilft dir weiter.
lg Andreas
... was heißt "ohne Erfolg" genau? Jedenfalls ist modifies SQL Data schon mal falsch.
D*B
Hallo,
für unser Anwendungsmodernisierungsprojekt benötige ich die Möglichkeit, aus einer C# Anwendung heraus das Kennwort des eigenen Benutzerprofils zu ändern, sei es weil es abgelaufen ist oder der Anwender von sich aus ändern möchte. Als notwendigen Wrapper, wollte ich eine SQL-Prozedur verwenden.
Seitens API habe ich die QSYCHGPW u. ihre Definition gefunden und mich dann an einer external SQL Procedure versucht.(https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_71/apis/QSYCHGPW.htm)
-- Erstellen 'QSYS/QSYCHGPW'
CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), INOUT ErrorCode CHAR(15))
LANGUAGE C MODIFIES SQL DATA
EXTERNAL NAME 'QSYS/QSYCHGPW'
PARAMETER STYLE GENERAL;
-- CALL
CALL ChgPwd('MEINUSR', 'PWALT', 'PWNEU', '');
Leider ohne Erfolg. Ebenso habe ich die optionale Parametergruppe als Parameter implementiert u. diverse Versuche unternommen - letztendlich alle ohne Erfolg. Einen konkrete Verdacht habe ich nicht, lediglich die Vermutung, dass es evtl. am letzten Parameter oder den optionalen liegen könnte.
Eine SQL Prozedur für den Aufruf der QSYS2.QCMDEXC analog dazu hat funktioniert, jedoch existieren hier nur IN-Parameter.
Den Hinweis zu den External SQL Procedures habe ich u.a. im folgenden gefunden:
http://www-01.ibm.com/support/docview.wss?uid=nas8N1017493
Die Frage ist auch, ob es über meinen Weg funktionieren kann, oder ich ein RPGLE dafür schreiben müsste (in Anlehnung an: http://www-01.ibm.com/support/docview.wss?uid=nas8N1014053 oder http://www.code400.com/forum/forum/tips-techniques-tools-announcements/tips-for-the-iseries-as400/1874-api-s-qsychgpw-qwcrsval)
So funktioniert es zumindest bei mir.
Hallo Andreas,
danke für die schnelle Antwort. Ich habe das mit den Leerzeichen mal so für meinen Benutzer übernommen. Es ist korrekt, dass er das Statement dann ausführt, allerdings wenn ich mich dann am Green-Screen versuche mit diesem Benutzer anzumelden, ist immer noch das "alte" Kennwort richtig. Ändert er wirklich bei dir das Kennwort?
Zum Ausführen des Statements habe ich bewusst den Test-Benutzer verwendet, für den ich auch das Kennwort ändern möchte. Als Release verwenden wir V7R2...
andreaspr@aon.at
17-01-18, 10:14
Ja, es hat das Passwort wirklich geändert.
Probiere es auch mal mit den Error-Code als IN Parameter zu ändern.
Bei einem Fehler wird sowieso eine SQL Exception geworfen die du im Programm auswerten kannst.
... was heißt "ohne Erfolg" genau? Jedenfalls ist modifies SQL Data schon mal falsch.
D*B
Ohne Erfolg heißt in dem Fall, das Statement im Tool "Run SQL Scripts" zwar erfolgreich ausgeführt, aber das Kennwort nicht geändert wird.
Return Code = 0
Statement ran successfully (15 ms)
Die jetzige Prozedurdefinition habe ich um die "Richtung" IN für den Parameter 4 ErrorCode geändert sowie das "Modifies SQL Data" erleichtert.
Letzter Stand:
CREATE PROCEDURE ChgPwd(IN UserId CHAR(10), IN CurrentPwd CHAR(10), IN NewPwd CHAR(10), IN ErrorCode CHAR(15))
LANGUAGE C
--MODIFIES SQL DATA
EXTERNAL NAME 'QSYS/QSYCHGPW'
PARAMETER STYLE GENERAL;
CALL ChgPwd('USERX ', 'A234567890', 'TEST ', '');
Aber es ist nach wie vor so, dass ich mich am Green-Screen nicht mit dem neuen Passwort anmelden kann, obwohl keine Exception oder ein Return-Code != 0 kommt.
Wenn ich die API richtig verstanden habe, kann ich zumindest bei fehlenden Rechten *SECOFR usw. mein eigenes PWD ändern?
Wenn man die (meist optionale) Error-Struktur angibt, wird eben keine Exception ausgeworfen, da diese ja im Zweifel in der Error-Struktur steht.
Einen Fehler gibt es nur, wenn man die Error-Struktur weglässt.
... ist denn sichergestellt, dass das nicht an der Berechtigung scheitert? Wenn im Benutzer nicht *CURRENT steht braucht man SECOFR!
Die Errorstruktur - Parameter 4 - kann man soweit ich gelesen bzw. getestet habe in dem Fall nicht weglassen. Jedoch kommt auch kein CPF / Error bzw. Return Code zurück.
Hallo Hr. Bender,
wegen der Berechtigung - ich hab es daraufhin im GreenScreen über den Befehl CHGPWD probiert, dieser funktioniert. Die Einstellung die sie meinen finde ich im DSPUSRPRF?
Kennwortüberprüfungen nicht gültig . . . . : 0
Status . . . . . . . . . . . . . . . . . . : *ENABLED
Datum der letzten Kennwortänderung . . . . : 04.12.06 10:20:02
Kennwort ist *NONE . . . . . . . . . . . . : *NO
Intervall für Kennwortablauf . . . . . . . : *SYSVAL
Kennwort durch Bef. auf abgelaufen gesetzt : *NO
Kennwortänderung blockieren . . . . . . . : *SYSVAL
Lokale Kennwortverwaltung . . . . . . . . : *YES