Anmelden

View Full Version : API QSYCHGPW in Visual Basic 6



Der_Unwissende
23-11-05, 21:40
Hallo Zusammen,

ich versuche krampfhaft das API QSYCHGPW in einem VB Programm zum Laufen zu bekommen. Die Verbindung zur AS400 funktioniert, sie wird mit einem User durchgeführt der *SECOFR ist. Es wird kein Fehler ausgegeben, aber das Passwort wird nicht geändert. Vielleicht hat von euch einer eine Idee.

Hier der Code:

Dim cniSeries2 As New ADODB.Connection
Dim cm_QSYS_QSYCHGPW As New ADODB.Command
CnString$ = "Provider=IBMDA400;Data Source=10.1.1.1;User ID=xxxx;Password=xxxxx"
cniSeries2.Open CnString, "", ""
Set cm_QSYS_QSYCHGPW.ActiveConnection = cniSeries2
cm_QSYS_QSYCHGPW.CommandText = "{{CALL /QSYS.LIB/QSYS.LIB/QSYCHGPW.PGM(?,?,?,?)}}"
cm_QSYS_QSYCHGPW.Prepared = True
cm_QSYS_QSYCHGPW.Parameters.Append cm_QSYS_QSYCHGPW.CreateParameter("USERID", adChar, adParamInput, 10)
cm_QSYS_QSYCHGPW.Parameters.Append cm_QSYS_QSYCHGPW.CreateParameter("CURPWD", adChar, adParamInput, 10)
cm_QSYS_QSYCHGPW.Parameters.Append cm_QSYS_QSYCHGPW.CreateParameter("NEWPWD", adChar, adParamInput, 10)
cm_QSYS_QSYCHGPW.Parameters.Append cm_QSYS_QSYCHGPW.CreateParameter("RETURN", adChar, adParamInputOutput, 12)
cm_QSYS_QSYCHGPW.Parameters.Item(0) = Main.TextUser
cm_QSYS_QSYCHGPW.Parameters.Item(1) = Main.TextPassword
cm_QSYS_QSYCHGPW.Parameters.Item(2) = Main.TextNewPassword
On Error Resume Next
cm_QSYS_QSYCHGPW.Execute

Fuerchau
24-11-05, 08:28
Der 4. Parameter muss als Struktur übergeben werden. Dabei darf keinerlei Übersetzung stattfinden. Die Struktur (Error-Code-Variable) ist folgendermassen aufgebaut:
1-4 = 4-Byte Binary Länge des gesamten Puffers
5-8 = 4-Byte Binary Länge des verfügbaren Puffers
9-15 = 7-Byte MSGID (CPF-Nachricht)
16 = Reserve
17-n = Daten zur MSGID

Die Daten werden in EBCDIC zurückgegeben.
Um den Parameter korrekt zu übergeben musst du als Parameter-Typ adBinary wählen und die Struktur vorher entsprechend aufbereiten.

Besser für den Aufruf von Programmen (incl. ASCII-EBCDIC-Wandlung) ist das CWBX-OCX mit Struktur-/String-/Long-Konvertern.

Wenn du Fehler ignorieren willst (dann allerdings ohne Kontrolle, ob das Kennwort tatsächlich geändert wurde) muss der 4. Parameter (adBinary) mit String$(8, vbNullChar) übergeben werden.

Bruno Jakob
24-11-05, 09:43
Muss es denn unbedingt der API sein. Es geht doch auch so:


' Variablen deklarieren
Dim systemNames As New cwbx.systemNames
Dim as400 As New cwbx.AS400System
On Error GoTo failed
' Standardsystem abrufen und zur Initialisierung des Objekts AS400System
' verwenden
as400.Define systemNames.DefaultSystem
' Versuchen, das Kennwort für Benutzer "user" auf dem Standardsystem zu ändern
as400.ChangePassword "user", "oldpw", "newpw"
MsgBox "Kennwort erfolgreich geändert"
Exit Sub
failed:
' Fehlerinformationen anzeigen
MsgBox "Fehlernummer = " & Err.Number & vbCr & _
"Fehlerbeschreibung = " & Err.Description & vbCr & _
"Fehlerquelle = " & Err.Source & vbCr & _
"iSeries Access für Windows-Rückkehrcode = " & as400.Errors.ReturnCode
' Alle zurückgegebenen iSeries Access für Windows-Nachrichten anzeigen
For Each cwbErr In as400.Errors
MsgBox "iSeries Access für Windows-Nachrichtentext: " & vbCr & cwbErr.Text
Next

Das ist ein Beispiel aus den Activex Automatisierungsobjekten.

Bruno