2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VS Code - z/OS連携 (2)基本構成

2
Last updated at Posted at 2026-05-22

はじめに

ここでは、Zowe Explorer、Z Open Editorを使用した接続構成、基本的な設定について解説します。

関連記事

VS Code - z/OS連携 (1)概要
VS Code - z/OS連携 (2)基本構成
VS Code - z/OS連携 (3)基本操作: ソース編集
VS Code - z/OS連携 (4)基本操作: JES操作など
VS Code - z/OS連携 (5)DBBユーザー・ビルド
VS Code - z/OS連携 (6)Advanced Capability
VS Code - z/OS連携 (7)AIエージェントの活用: 概要
VS Code - z/OS連携 (8)AIエージェントの活用: 実践編

全体像

image.png

z/OS側コンポーネント構成サンプル

ここでは、z/OS側コンポーネントの構成情報のサンプルを抜粋して記載します。あくまで構成の参考としてご参照ください。
※TAZ(Test Accelarator for Z)に含まれる On-Demand Environment(旧ZD&T)で提供されるStock Imageの環境をベースに一部カスタマイズしたものです。
z/OSのバージョンはV3.2です。

z/OSMF関連

Angel Process起動プロシージャー
SYS1.PROCLIB(IZUANG1)
//IZUANG1  PROC P='',C=N,OUTCLS='*',
//   IZUTIME=NOLIMIT,
//   NAME=IZUANG1,
//   WLPDIR='/usr/lpp/zosmf/liberty'
//*--------------------------------------------------------------*/
//* Startup procedure for the z/OSMF Websphere Liberty Profile   */
//* Angel process.                                               */
//*--------------------------------------------------------------*/
//*
//STEP1   EXEC PGM=BPXBATA2,REGION=0M,
//  TIME=&IZUTIME.,
//  PARM='PGM &WLPDIR./lib/native/zos/s390x/bbgzangl COLD=&C NAME=&NAME
//              &P'
//STDOUT    DD  SYSOUT=&OUTCLS
//STDERR    DD  SYSOUT=&OUTCLS
RACF STARTEDクラス: IZUANG1.*
RLIST STARTED IZUANG1.* STDATA
CLASS      NAME
-----      ----
STARTED    IZUANG1.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= IZUSVR
GROUP= IZUADMIN
TRUSTED= NO
PRIVILEGED= NO
TRACE= YES
z/OSMFサーバー起動プロシージャー
SYS1.PROCLIB(IZUSVR1)
//IZUSVR1  PROC PARMS='zosmfServer',     /* Server parms          */
//      ROOT='/usr/lpp/zosmf',           /* z/OSMF installation root */
//      WLPDIR='/usr/lpp/zosmf/liberty', /* Liberty directory        */
//      OUTCLS='*',                      /* SYSOUT class             */
//      USERDIR='/global/zosmf',         /* Configuration directory  */
//      TRACE='N',                       /* Trace option             */
//      KCINDEX='Y',                     /* KC index rebuild flag */
//      IZUPRM='00',                     /* Parmlib suffixes or PREV */
//      SERVER='AUTOSTART',              /* AUTOSTART server         */
//      Z='0',                           /* Reserved for IBM         */
//      IZUMEM=4G                        /* Server memlimit          */
//*
//*--------------------------------------------------------------*/
//* z/OSMF AUTOSTART Websphere Liberty Profile server startup    */
//* procedure                                                    */
//*--------------------------------------------------------------*/
//*------------------------------------------------------------------
//* Parse z/OSMF PARMLIB member
//*------------------------------------------------------------------
//ZPARM   EXEC  PGM=IZUPARMS,REGION=0M,
// PARM='/IZUPRM=&IZUPRM,TRACE=&TRACE,USERDIR=&USERDIR,SERVER=&SERVER,Z
//             =&Z'
//*
//DFLTCFG  DD  PATH='&ROOT./defaults/configuration.defaults'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//CEEDUMP  DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Configure z/OSMF server
//*------------------------------------------------------------------
//CONFZMF EXEC PGM=BPXBATCH,REGION=0M,COND=(0,LT),
// PARM='SH &ROOT./bin/izuconfig.sh &ROOT &USERDIR &TRACE &KCINDEX'
//*
//SYSPRINT DD  SYSOUT=&OUTCLS
//SYSOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//STDOUT   DD  SYSOUT=&OUTCLS
//*
//*------------------------------------------------------------------
//* Start the Websphere Liberty Profile server
//*
//* WLPUDIR - PATH DD that points to the Liberty Profile's "user"
//*           directory. If the DD is not allocated, the user
//*           directory location defaults to the wlp/usr directory
//*           in the install tree.
//* STDOUT  - Destination for stdout (System.out)
//* STDERR  - Destination for stderr (System.err)
//* STDENV  - Initial Unix environment - read by the system.  The
//*           installation default and server specific server
//*           environment files will be merged into this environment
//*           before the JVM is launched.
//*------------------------------------------------------------------
//ZOSMF   EXEC  PGM=BPXBATSL,REGION=0M,COND=(0,LT),
//  MEMLIMIT=&IZUMEM.,TIME=NOLIMIT,
//  PARM='PGM &WLPDIR./lib/native/zos/s390x/bbgzsrv --clean &PARMS'
//*
//WLPUDIR  DD  PATH='&USERDIR./configuration'
//*
//STDOUT   DD  SYSOUT=&OUTCLS
//STDERR   DD  SYSOUT=&OUTCLS
//*STDOUT   DD PATH='&ROOT/izusvr1.stdout',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU
//*STDERR   DD PATH='&ROOT/izusvr1.stderr',
//*            PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//*            PATHMODE=SIRWXU

RACF STARTEDクラス: IZUSVR1.*
RLIST STARTED IZUSVR1.* STDATA
CLASS      NAME
-----      ----
STARTED    IZUSVR1.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= IZUSVR
GROUP= IZUADMIN
TRUSTED= NO
PRIVILEGED= NO
TRACE= YES
IZUPRMxx

参考: IZUPRMxx reference information

SYS1.PARMLIB(IZUPRM00)
HOSTNAME('*')

HTTP_SSL_PORT(10443)

INCIDENT_LOG UNIT('SYSALLDA')

JAVA_HOME('/usr/lpp/java/java21/current_64/')

KEYRING_NAME('ZOSMF_RING')

LOGGING('*=warning:com.ibm.zoszmf.*=info:com.ibm.zoszmf.environment.ui=
finer')

RESTAPI_FILE ACCT(IZUACCT) REGION(65536) PROC(IZUFPROC)

COMMON_TSO ACCT(IZUACCT) REGION(50000) PROC(IZUFPROC)

SAF_PREFIX('IZUDFLT')

SEC_GROUPS USER(IZUUSER),ADMIN(IZUADMIN),SECADMIN(IZUSECAD)

SESSION_EXPIRE(495)

TEMP_DIR('/tmp')

UNAUTH_USER(IZUGUEST)

SERVER_PROC('IZUSVR1')

ANGEL_PROC('IZUANG1')

AUTOSTART('CONNECT')

AUTOSTART_GROUP('NONE')

USER_DIR('/global/zosmf')

CLOUD_SEC_ADMIN('IBMUSER')

WLM_CLASSES DEFAULT(IZUGHTTP)
            LONG_WORK(IZUGWORK)

/* Uncomment PLUGINS statement and the names of the plugins you
    wish to use below:                                              */

/* PLUGINS( CAPACITY_PROV,
             COMMSERVER_CFG,
             INCIDENT_LOG,
             ISPF,
             RESOURCE_MON,
             SOFTWARE_MGMT,
             SYSPLEX_MGMT,
             WORKLOAD_MGMT,
             ZERT_ANALYZER)   */

PLUGINS(COMMSERVER_CFG,
        ISPF,
        SOFTWARE_MGMT,
        RESOURCE_MON,
        WORKLOAD_MGMT)
F IZUSVR1,DISPLAY IZU

参考: Displaying the z/OSMF server settings

VS01      2026110  13:13:53.94            -f IZUSVR1,DISPLAY IZU
VS01      2026110  13:13:54.04  STC00353   +CWWKB0004I: z/OSMF PARMLIBs DISPLAY
                                             IZUG200I The home page of z/OSMF server in SYSTEM(VS01)
                                             https://STD1.example.com:10443/zosmf
                                             IZUG041I The server started at  04/03/2026 20:23:42
                                              and has been running for  16 day(s) 16 hour(s) 50 minute(s) 12 secon
                                            d(s)

                                             Current z/OSMF settings                               Source

                                             HOSTNAME(STD1.example.com)                            IZUPRM00
VS01      2026110  13:13:54.05  STC00353   +CWWKB0061I CONTINUATION 1 FOR MESSAGE IDENTIFIER 98234
                                             HTTP_SSL_PORT(10443)                                  IZUPRM00
                                             LOGGING('*=warning:com.ibm.zoszmf.*=info:com.ibm.zoszm
                                             f.environment.ui=finer')                              IZUPRM00
                                             UNAUTH_USER(IZUGUEST)                                 IZUPRM00
                                             SEC_GROUPS
                                                 ADMIN(IZUADMIN)                                   IZUPRM00
                                                 USER(IZUUSER)                                     IZUPRM00
                                                 SECADMIN(IZUSECAD)                                IZUPRM00
                                             SAF_PREFIX(IZUDFLT)                                   IZUPRM00
VS01      2026110  13:13:54.07  STC00353   +CWWKB0061I CONTINUATION 2 FOR MESSAGE IDENTIFIER 98234
                                             CLOUD_SAF_PREFIX(IYU)                                 DEFAULT
                                             KEYRING_NAME(ZOSMF_RING)                              IZUPRM00
                                             SESSION_EXPIRE(495)                                   IZUPRM00
                                             WLM_CLASSES
                                                 LONG_WORK(IZUGWORK)                               IZUPRM00
                                                 DEFAULT(IZUGHTTP)                                 IZUPRM00
                                             JAVA_HOME(/usr/lpp/java/java21/current_64/)           IZUPRM00
                                             TEMP_DIR(/tmp)                                        IZUPRM00
                                             INCIDENT_LOG UNIT(SYSALLDA)                           IZUPRM00
VS01      2026110  13:13:54.07  STC00353   +CWWKB0061I CONTINUATION 3 FOR MESSAGE IDENTIFIER 98234
                                             RESTAPI_FILE
                                                 ACCT(IZUACCT)                                     IZUPRM00
                                                 PROC(IZUFPROC)                                    IZUPRM00
                                                 REGION(65536)                                     IZUPRM00
                                             COMMON_TSO
                                                 ACCT(IZUACCT)                                     IZUPRM00
                                                 PROC(IZUFPROC)                                    IZUPRM00
                                                 REGION(50000)                                     IZUPRM00
                                             AUTOSTART_GROUP(NONE)                                 IZUPRM00
VS01      2026110  13:13:54.07  STC00353   +CWWKB0061I CONTINUATION 4 FOR MESSAGE IDENTIFIER 98234
                                             AUTOSTART(CONNECT)                                    IZUPRM00
                                             SERVER_PROC(IZUSVR1)                                  IZUPRM00
                                             ANGEL_PROC(IZUANG1)                                   IZUPRM00
                                             USER_DIR(/global/zosmf)                               IZUPRM00
                                             CSRF_SWITCH(ON)                                       DEFAULT
                                             CLOUD_SEC_ADMIN(IBMUSER)                              IZUPRM00

                                             Status of z/OSMF plugins

VS01      2026110  13:13:54.09  STC00353   +CWWKB0061I CONTINUATION 5 FOR MESSAGE IDENTIFIER 98234
                                             Configuration Assistant(STARTED)                      IZUPRM00
                                             Capacity Provisioning(UNSPECIFIED)                    DEFAULT
                                             Workload Management(STARTED)                          IZUPRM00
                                             Resource Monitoring(STARTED)                          IZUPRM00
                                             Incident Log(UNSPECIFIED)                             DEFAULT
                                             Software Management(STARTED)                          IZUPRM00
                                             WebISPF(STARTED)                                      IZUPRM00
                                             ZERT(UNSPECIFIED)                                     DEFAULT
                                             Sysplex Management(UNSPECIFIED)                       DEFAULT
VS01      2026110  13:13:54.10  STC00353   +CWWKB0005I: COMMAND RESPONSES COMPLETED SUCCESSFULLY FROM display
                                            izu|setizu Command Handler.
VS01      2026110  13:13:54.12  STC00353   +CWWKB0002I: MODIFY COMMAND DISPLAY IZU COMPLETED SUCCESSFULLY.
/global/zosmf/configuration/local_override.cfg
/global/zosmf/configuration/local_override.cfg
JVM_OPTIONS="-Dcom.ibm.ws.classloading.tcclLockWaitTimeMillis=300000\n-Xshareclasses:cacheDir=/javasc/izusvr1,name=izusvr1cache\n-Xscmx150M\n-Xquickstart\n-Xms256M\n-Xmx1024M\n-Xlp:objectheap:pagesize=1m,warn,pageable\n-Xlp:codecache:pagesize=1m,pageable\n-Xscmaxaot150M"
CEA(Common Event Adapter)

参考: Ensure that common event adapter (CEA) is configured and active

SYS1.PARMLIB(CEAPRM00)
SNAPSHOT(N)

HLQLONG(CEA)

DUMPCAPTURETIME
  (
    SLIP(OPERLOG(00:30:00)  LOGREC(01:00:00)
     LOGRECSUMMARY(04:00:00))

    DUMP(OPERLOG(00:30:00)  LOGREC(01:00:00)
     LOGRECSUMMARY(04:00:00))

    ABEND(OPERLOG(00:30:00)  LOGREC(01:00:00)
     LOGRECSUMMARY(04:00:00))
  )

TSOASMGR
  (
    MAXSESSIONS(50)
    MAXSESSPERUSER(10)
    RECONSESSIONS(0)
    RECONTIME(00:00:00)
  )

CIM(Common Information Model) Server

参考: Quick guide: CIM server setup and verification

SYS1.PROCLIB.INSTALL(CFZCIM)
//CFZCIM PROC
//********************************************************************
//*  STEP 1 - Start cimserver                                        *
//********************************************************************/
//STEP1    EXEC PGM=BPXBATCH,TIME=NOLIMIT,REGION=0M,
//         PARM='PGM /usr/lpp/wbem/bin/cimserver daemon=false'
//STDENV   DD   PATH='/etc/wbem/cimserver.env'
//STDOUT   DD   PATH='/var/wbem/logs/cimserver.out',
//         PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//         PATHMODE=(SIRUSR,SIWUSR,SIRGRP)
//STDERR   DD   PATH='/var/wbem/logs/cimserver.err',
//         PATHOPTS=(OWRONLY,OCREAT,OTRUNC),
//         PATHMODE=(SIRUSR,SIWUSR,SIRGRP)
//CEEDUMP  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//SYSMDUMP DD SYSOUT=*
//********************************************************************
//*  STEP 2 - Copy stdout back to joblog                             *
//********************************************************************/
//STEP2    EXEC PGM=BPXBATCH,
//         PARM='PGM /bin/cat /var/wbem/logs/cimserver.out',
//         COND=EVEN
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//********************************************************************
//*  STEP 3 - Copy stderr back to joblog                             *
//********************************************************************/
//STEP3    EXEC PGM=BPXBATCH,
//         PARM='PGM /bin/cat /var/wbem/logs/cimserver.err',
//         COND=EVEN
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
/etc/wbem/cimserver.env
PEGASUS_HOME=/usr/lpp/wbem
LIBPATH=/usr/lpp/wbem/lib:/usr/lpp/wbem/provider:/usr/lib
_CEE_RUNOPTS=FILETAG(AUTOCVT,AUTOTAG) STACK(32K,32K,ANYWHERE,KEEP,96K,32K) THREADSTACK(ON,128K,64K,ANYWHERE,KEEP,96K,32K) HEAP(32M,8M,ANYWHERE,KEEP,8K,4K) ANYHEAP(7M,1M,ANYWHERE,FREE) HEAPP(ALIGN,8,1,16,3,32,6,56,8,80,5,248,5,2064,13,4104,27,8208,4,16392,1,32784,2,65536,10) TERMTHDACT(UADUMP) DYN(*USERID,DYNAMIC,TDUMP)
_BPX_SHAREAS=NO
_BPXK_AUTOCVT=ON
_TAG_REDIR_ERR=TXT
_TAG_REDIR_IN=TXT
_TAG_REDIR_OUT=TXT
_BPXK_GPSENT_SECURITY=THREAD
#OSBASE_TRACE=0
#OSBASE_TRACE_FILE=/tmp/wbemosbase.trc
#RMF_CIM_HOST=127.0.0.1
#RMF_CIM_PORT=8803
#RMF_CIM_TRACE=0
#RMF_CIM_TRACE_FILE=/tmp/wbemosmonitoring.trc
RMF_CIM_PROVIDER=DISABLE

RSE関連

JMON

JMON起動プロシージャー
SYS1.PROCLIB(JMON)
//*********************************************************************
//*
//* JES JOB MONITOR
//*
//JMON     PROC PRM=,                      * PRM='-TV' TO START TRACING
//            LEPRM='RPTOPTS(ON)',
//            HLQ=FEK,
//            CFG=FEK.#CUST.PARMLIB(FEJJCNFG)
//*
//JMON     EXEC PGM=FEJJMON,REGION=0M,TIME=NOLIMIT,
//            PARM=('&LEPRM,ENVAR("_CEE_ENVFILE_S=DD:ENVVARS")/&PRM')
//STEPLIB  DD DISP=SHR,DSN=&HLQ..SFEKAUTH
//ENVVARS  DD DISP=SHR,DSN=&CFG
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//         PEND
//*
JMON構成ファイル

参考: FEJJCNFG, the JES Job Monitor configuration file

FEK.#CUST.PARMLIB(FEJJCNFG)
#
# JES JOB MONITOR CONFIGURATION FILE
#
# (1) REQUIRED DEFINITIONS
#
SERV_PORT=8115
TZ=EST5EDT
#
# (2) OPTIONAL DEFINITIONS
#
#APPLID=FEKAPPL
#AUTHMETHOD=SAF
#CODEPAGE=UTF-8
#CONCHAR=$
#CONSOLE_INTERVAL=100
#CONSOLE_NAME=JMON
#DISPLAY_ACTIVE=ON
#DISPLAY_SYSIN=OFF
#ENF70_MONITOR_INTERVAL=5
#GEN_CONSOLE_NAME=OFF
#HOST_CODEPAGE=IBM-1047
#LIMIT_COMMANDS=USERID
#LIMIT_CONSOLE=LIMITED
#LIMIT_VIEW=NOLIMIT
#LISTEN_QUEUE_LENGTH=5
#LOOPBACK_ONLY=ON
#MAX_DATASETS=32
#MAX_THREADS=200
#PASS_PHRASE=OFF
#TIMEOUT=3600
#TIMEOUT_INTERVAL=1200
#TRACE_STORAGE=OFF
#SAF_CLASS=FACILITY
#SEARCHALL=OFF
#SUBMIT_TIMEOUT=30
#SUBMITMETHOD=TSO
#TSO_TEMPLATE=FEK.#CUST.CNTL(FEJTSO)

RSED

RSED起動プロシージャー
SYS1.PROCLIB(RSED)
//*********************************************************************
//*
//* RSE DAEMON
//*
//RSED     PROC IVP=,                         * 'IVP' to do an IVP test
//            PORT=,
//            CNFG='/etc/zexpl',
//            HOME='/usr/lpp/IBM/zexpl'
//*
//RSED     EXEC PGM=BPXBATSL,REGION=0M,TIME=NOLIMIT,
// PARM='PGM &HOME./bin/rsed.sh &IVP -C&CNFG -P&PORT'
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//         PEND
//*
RSE構成ファイル

参考: rse.env, the RSE configuration file

/etc/zexpl/rse.env
# Specify the RSE Daemon and JES Job Monitor ports
#-------------------------------------------------------------
_RSE_RSED_PORT=8137
_RSE_JMON_PORT=8115

# Specify the directory where Java is installed
#-------------------------------------------------------------
JAVA_HOME=/usr/lpp/java/java21/current_64/

# Specify the directories where RSE plugins are installed
#-------------------------------------------------------------
RSE_PLUGIN_PATH=/usr/lpp/IBM/zee:/usr/lpp/IBM/debug/rse

# Specify Java options to start RSE server
#-------------------------------------------------------------
## load balancing
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -Xms256m -Xmx512m -Xquickstart"

## logs
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -Dkeep.last.log=true"

## system
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -DDISABLE_MIGRATE_HRECALL_HDELETE=true"

# Specify the port range for RSE client connections
#-------------------------------------------------------------
_RSE_PORTRANGE=8138-8139

# Specify System SSL variables to limit protocol/cipher selection
#-------------------------------------------------------------
GSK_V3_CIPHER_SPECS_EXPANDED=130113021303003C003D003E00680069006A

#=============================================================
# Additional environment variables
#=============================================================
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -Xms256m -Xmx512m -Xquickstart -Xscmx30m"
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -Xshareclasses:nonFatal,cacheDirPerm=0777,cacheDir=/javasc/rsed,name=rsedcache"
_RSE_JAVAOPTS="$_RSE_JAVAOPTS -Xlp:objectheap:pagesize=1m,warn,pageable -Xlp:codecache:pagesize=1m,pageable"

ISPF Gateway構成ファイル

※TSOコマンド実行に必要
参考: ISPF.conf, the Legacy ISPF Gateway configuration file

*
* ISPF.conf - "Legacy ISPF Gateway" configuration file
*
* Note: This is a copy of ISPF's ISP.SISPSAMP(ISPZISPC)
*       with z/OS Explorer customizations
*

* REQUIRED:
* Below is the minimum requirements for ISPF allocation.
* Change the default ISPF dataset names below to match your host site.
* Add additional dsn concatenations on same line and separate by comma.
* Order of datasets listed is search order in concatenation.

ispllib=ISP.SISPLOAD
ispmlib=ISP.SISPMENU
isptlib=ISP.SISPTENU
ispplib=ISP.SISPPENU
ispslib=ISP.SISPSLIB
sysproc=ISP.SISPCLIB,FEK.SFEKPROC


* OPTIONAL:
* Include below your own additional user exec for data set allocations.
* A sample exec is found in ISPF's samplib, ISP.SISPSAMP(ISPZISP2).
* If required, remove the * below and provide the absolute reference to
* your exec. When using allocjob, Be careful not to undo allocations
* done earlier in ISPF.conf.

*allocjob = ISP.SISPSAMP(ISPZISP2)


* OPTIONAL:
* When using re-usable ISPF sessions then the following timeout
* parameter will determine the time a users ISPF session will remain
* idle between service requests before shutting itself down.
* At the next request a new session will be established automatically.
* If required, remove the * below and specify, in seconds, the default
* time for all sessions. If not set, the default idle time is 15 min.   .

*ISPF_timeout = 900

--- 以下、IDz EE 用構成 (要ライセンス) ---

z/OS Explorer Extensions構成ファイル

※Z Open Editor - Advanced Capabilityの自動Activationに必要

参考: zee.env, the environment configuration file

/etc/zexpl/zee.env
#
# z/OS Explorer Extensions
# zee.env - environment variables
#

#=============================================================
# optional definitions, defaults provided if not specified
#=============================================================

# HLQ where zExplExt FMID HHOPxxx is installed (default read from ELAXF)
#-------------------------------------------------------------
FEL_HLQ=${ELAXF_FEL:-FEL}

IFAPRDxx

※Z Open Editor - Advanced Capabilityの自動Activationに必要
参考: Product enablement in IFAPRDxx

SYS1.PARMLIB(IFAPRD01)
...
PRODUCT OWNER('IBM CORP')
   NAME('IBM IDz EE')
   ID(5755-AB5)
   VERSION(*) RELEASE(*) MOD(*)
   FEATURENAME(*)
   STATE(ENABLED)
...

RSE API

RSE API起動プロシージャー
SYS1.PROCLIB(RSEAPI)
//*********************************************************************
//*
//* RSE API
//*
//RSEAPI   PROC HOME='/usr/lpp/IBM/rseapi',
//            APICFG='/etc/zexpl',
//            RSECFG='',
//            SRVNUM='1',
//            SECURE='true'
//*
//         EXPORT SYMLIST=*
//         SET QUOTE=''''
//         SET HOME=&QUOTE.&HOME.&QUOTE.
//         SET RSECFG=&QUOTE.&RSECFG.&QUOTE.
//         SET APICFG=&QUOTE.&APICFG.&QUOTE.
//         SET SRVNUM=&SRVNUM.
//         SET SECURE=&QUOTE.&SECURE.&QUOTE.
//*
//RSEAPI   EXEC PGM=BPXBATSL,REGION=0M,TIME=NOLIMIT,
//            PARM='PGM /bin/sh &HOME./tomcat.base/start.sh'
//STDOUT   DD SYSOUT=*
//STDERR   DD SYSOUT=*
//STDENV   DD *,SYMBOLS=JCLONLY
_BPXK_AUTOCVT=ON
CATALINA_RUN=run
RSEAPI_CFG=&APICFG
RSE_CFG=&RSECFG
SERVER_NUM=&SRVNUM
SECURE_SERVER=&SECURE
//         PEND
//*

RACF STARTEDクラス: RSEAPI.*
RLIST STARTED RSEAPI.* STDATA
CLASS      NAME
-----      ----
STARTED    RSEAPI.* (G)

LEVEL  OWNER      UNIVERSAL ACCESS  YOUR ACCESS  WARNING
-----  --------   ----------------  -----------  -------
 00    IBMUSER         NONE               NONE    NO

INSTALLATION DATA
-----------------
NONE

APPLICATION DATA
----------------
NONE

AUDITING
--------
FAILURES(READ)

NOTIFY
------
NO USER TO BE NOTIFIED

STDATA INFORMATION
------------------
USER= STCRSE
GROUP= SYS1
TRUSTED= NO
PRIVILEGED= NO
TRACE= NO
RSE API 構成ファイル

参考: rseapi.env, the RSE API configuration file

/etc/zexpl/rseapi.env
#
# rseapi.env - RSE API environment variables
#

#=============================================================
# optional definitions, defaults provided if not specified
#=============================================================

# Directory where Java is installed (default set in rse.env)
#-------------------------------------------------------------
JAVA_HOME=/usr/lpp/java/java21/current_64/

# RSE API server and JES Job Monitor ports
#-------------------------------------------------------------
RSEAPI_PORT_HTTP_1="8195"
RSEAPI_PORT_SHUTDOWN_1="8196"
RSEAPI_JMON_PORT_1="8115"

# Encrypted communication details
#-------------------------------------------------------------
# Use this for a keystore file or a RACF keyring owned by the
# started task user ID
#RSEAPI_KEYRING="RSEDRING"
RSEAPI_KEYRING="RSEDRING2"

# For JCERACFKS keystore
#RSEAPI_KEYSTORE_FILE="safkeyringjce://$(id -un)/$RSEAPI_KEYRING"
#RSEAPI_KEYSTORE_PASS="password"
RSEAPI_KEYSTORE_TYPE="JCERACFKS"

# Options to enable SAF JWT support
# Default to true.
#-------------------------------------------------------------
#RSEAPI_SAF_JWT=true
RSEAPI_SAF_JWT=false

# To enable the Common Properties service, this variable needs to
# set to a shared UNIX directory on the system.
#-------------------------------------------------------------
RSE_COMMON_PROPERTIES=/var/rseapi_common

# Disable data set migration, recall and deletion of migrated data set.
# The default value is false.
#-------------------------------------------------------------
DISABLE_MIGRATE_HRECALL_HDELETE=true

# The host port to use when creating a connection from the server to
# the TN3270 emulator.
# The default is 23
#-------------------------------------------------------------
RCE_PORT=992

# Whether or not to use a secure connection when connecting from the
# server application to the TN3270 emulator.
# The default is false.
#-------------------------------------------------------------
RCE_SECURITY=true

CATALINA_OPTS="$CATALINA_OPTS -Xms256m -Xmx512m -Xquickstart -Xscmx30m"
CATALINA_OPTS="$CATALINA_OPTS -Xshareclasses:nonFatal,cacheDirPerm=0777,cacheDir=/javasc/rseapi,name=rseapicache"
CATALINA_OPTS="$CATALINA_OPTS -Xlp:objectheap:pagesize=1m,warn,pageable -Xlp:codecache:pagesize=1m,pageable"
RSE_COMMON_PROPERTIES=/var/rseapi_common

補足:
Z Open EditorのAdvanced Capabilityに含まれる3270エミュレーター機能(RCE: Remote Connection Emulator)を使用するため、RSEAPI_SAF_JWT=falseRSEAPI_KEYRING="RSEDRING2"とし、当該環境用にKeyRing, サーバー証明書を作成しなおしています。詳細は後続記事で記載予定。

SSH関連

SSHD起動プロシージャー
SYS1.PROCLIB(SSHD)
//SSHD     PROC
//SSHD     EXEC PGM=BPXBATCH,REGION=0M,TIME=NOLIMIT,
// PARM='PGM /bin/sh -c /etc/ssh/sshd.sh'
//* STDIN AND STDOUT ARE BOTH DEFAULTED TO /dev/null
//STDERR DD PATH='/tmp/sshd.stderr',
// PATHOPTS=(OWRONLY,OCREAT,OAPPEND),PATHMODE=(SIRWXU)
SSHデーモン構成ファイル

参考: sshd_config - OpenSSH daemon configuration file

# /****PROPRIETARY_STATEMENT******************************************/
# /*                                                                 */
# /*   LICENSED MATERIALS - PROPERTY OF IBM                          */
# /*   5655-M23 COPYRIGHT IBM CORP. 2004, 2018                       */
# /*                                                                 */
# /*   STATUS= HOS2240                                               */
# /*                                                                 */
# /****END_OF_PROPRIETARY_STATEMENT***********************************/

#PermitRootLogin prohibit-password
# Note: For compatibility with previous versions we still allow this
# Note: Customers should consider disabling root (superuser) logins
PermitRootLogin yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
HostbasedAuthentication yes

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
PermitEmptyPasswords no

UseDNS no

# override default of no subsystems
Subsystem       sftp    /usr/lib/ssh/sftp-server

Match User IBMUSER
        AllowTcpForwarding yes
        
# Allow specific user IDs
AllowUsers IBMUSER DEV01 USER01 ...

セキュリティー設定についての補足

実行権限やリソースへのアクセス制限については、基本的に使用するTSOユーザー/グループをベースにRACF等のセキュリティー・マネージャー機能で制御する、という考え方は従来と同様です。
それに加えて、使用する接続方式ごとに追加で考慮が必要になる部分があります。
詳細は以下のドキュメントもご参照ください。

参考:
z/OSMF - Security structures for z/OSMF
RSE - Security definitions

VS Codeワークスペース

VS Codeでは"ワークスペース"という考え方があり、ワークスペース単位に独自の設定などを行うことができます。OS上の1つのディレクトリを1ワークスペースとして管理する Single-folderワークスペースと、複数のディレクトリのセットをまとめて1ワークスペースとして管理する Multi-rootワークスペースという使い方があります。

参考:
What is a VS Code "workspace"?

Git管理されているRepositroyを扱う場合、ローカルにクローンした1つのRepositoryを1つのワークスペースとして扱うと制御がしやすいかと思います。そのため、ここでは Single-folderワークスペースの利用をベースとして具体例を見ていきたいと思います。

Single-folderワークスペース利用例

ワークスペースとして使用する適当なフォルダをWindows上に用意しておいて、そのフォルダをVS Codeで開けばOKです。
例えば、ZoweTemp01というフォルダを作成しておき、VS Codeのメニューから[ファイル]-[フォルダーを開く]選択し、ZoweTemp01を選びます。
image.png

最初に開く際には以下のポップアップが表示されるので信頼するをクリック。
image.png

ヘッダー部分とエクスプローラービューにフォルダー名が表示されていればOK
image.png

当該フォルダがワークスペースとして開かれた状態になりました。

※コマンドプロンプトなどから当該フォルダーに移動してcode .を実行しても可


続けてVS Codeの設定変更をしてみます。
メニューから[ファイル]-[ユーザー設定]-[設定]を選択すると、各種設定が行えるViewが開きます。
検索窓の下に"ユーザー", "ワークスペース"というタブがあることからも分かるように、設定をこれらのレベルで使い分けることができます。ワークスペース単位で設定を切り替えたい場合は"ワークスペース"タブで設定を行えばよいということになります。

image.png

例えば上の例では、Zowe Explorer関連の設定で、ワークスペースレベルで「Zowe: Logger」というプロパティーの値をINFO → DEBUGに変更してみました。
このようなワークスペースレベルの設定変更情報は、.vscode\settings.jsonファイルが作成されこのファイル内に保持されます。
image.png

ユーザーレベルのプロパティー設定は、<ユーザーのホームディレクトリ>\AppData\Roaming\Code\User\setting.jsonファイルに保存されます。

ちなみに、VS CodeのExtensionは、ワークスペース単位で無効化することができます。たくさんExtensionを入れて分かりにくくなってしまった場合、ワークスペース毎に不要なExtensionは無効化することで画面を簡素化するといった制御も可能です。
例: Extensionの「無効にする」の右側のプルダウンメニューにある「無効にする(ワークスペース)」を選択すると、その時点で開いているワークスペース上でのみ当該Extensionが無効化されます。
image.png

こんな感じでワークスペースの制御が行われています。
※この辺りはZowe Explorerに関係なく、一般的なVS Codeの話です。

z/OSとの接続構成

z/OS接続構成ファイルの管理

z/OSとの接続構成情報は、グローバル/プロジェクトの2つのレベルで保持できます。
"グローバル"はVS Codeを使用するユーザーの単位で保持され、当該ユーザーで使用する全ての環境で有効となります。これは先の記事で作成した、<ユーザーのホームディレクトリ>\.zowe\zowe.config.jsonファイルに該当します。
"プロジェクト"レベルはVS Codeのワークスペース単位で保持され、ワークスペースの範囲で有効となります。

種類 構成ファイル 有効範囲
グローバル <ユーザーのホーム>\.zowe\zowe.config.json 当該ユーザーの全環境
プロジェクト <ワークスペースのトップ>\zowe.config.json ワークスペース

ワークスペースをGitで管理する場合、構成情報もGit管理対象に含めることができるので、プロジェクト単位での管理を行っておくと管理がしやすいと思います。

Zowe Explorer view の 「データ・セット」の右側の「+」アイコンをクリック
image.png

Create a New Team Configuration FIleをクリック
image.png

以下のようにGlobal/Projectの選択肢が表示されます。ここでは「Project」を選択してみます。
image.png

すると、当該ワークスペースに紐づけられたフォルダ(今回のケースだとZoweTest01ディレクトリ下)に、zowe.config.jsonファイルが作成されて、z/OSとの接続構成の雛形が作成されます。

接続構成雛形
zowe.config.json
{
    "$schema": "./zowe.schema.json",
    "profiles": {
        "zosmf": {
            "type": "zosmf",
            "properties": {
                "port": 443
            },
            "secure": []
        },
        "tso": {
            "type": "tso",
            "properties": {
                "account": "",
                "codePage": "1047",
                "logonProcedure": "IZUFPROC"
            },
            "secure": []
        },
        "ssh": {
            "type": "ssh",
            "properties": {
                "port": 22
            },
            "secure": []
        },
        "rse": {
            "type": "rse",
            "properties": {
                "port": 6800,
                "basePath": "rseapi",
                "protocol": "https"
            },
            "secure": []
        },
        "project_base": {
            "type": "base",
            "properties": {
                "host": "",
                "rejectUnauthorized": true
            },
            "secure": [
                "user",
                "password"
            ]
        }
    },
    "defaults": {
        "zosmf": "zosmf",
        "tso": "tso",
        "ssh": "ssh",
        "rse": "rse",
        "base": "project_base"
    },
    "autoStore": true
}

このファイルをカスタマイズしてz/OSとの接続定義を行うことができます。

参考:
Creating Zowe Explorer profiles
Managing and using profiles

z/OSMF Profile

z/OSMF profile設定例

zowe.config.json
{
    "$schema": "./zowe.schema.json",
    "profiles": {
        "odeinst1": {
            "properties": {
                "host": "odeinst1"
            },
            "profiles": {
                "zosmf": {
                    "type": "zosmf",
                    "properties": {
                        "port": 10443,
                        "encoding": "IBM-939",
                        "rejectUnauthorized": false
                    },
                    "secure": ["user", "password"]
                }
            }
        }
    },
    "defaults": {
        "zosmf": "odeinst1.zosmf"
    },
    "autoStore": true
}

上の構成例は、以下のようなz/OS環境がある前提で、このz/OSへの接続設定を行ったものです。以下の接続先の情報を定義し、VS Code上からはホスト名と同じodeinst1という名前で認識するよう定義しています。

  • ホスト名: odeinst1
  • z/OSMF構成済み(HTTPSのポート番号: 10443)

RSE Profile

RSE profile設定例

zowe.config.json
{
    "$schema": "./zowe.schema.json",
    "profiles": {
        "odeinst1": {
            "properties": {
                "host": "odeinst1"
            },
            "profiles": {
                "rse": {
                    "type": "rse",
                    "properties": {
                        "rejectUnauthorized": false,
                        "port": 8195,
                        "basePath": "rseapi",
                        "protocol": "https"
                    },
                    "secure": ["user", "password"]
                }
            }
        }
    },
    "defaults": {
        "zosmf": "odeinst1.zosmf"
    },
    "autoStore": true
}

上の構成例は、以下のようなz/OS環境がある前提で、このz/OSへの接続設定を行ったものです。以下の接続先の情報を定義し、VS Code上からはホスト名と同じodeinst1という名前で認識するよう定義しています。

  • ホスト名: odeinst1
  • z/OSMF構成済み(HTTPSのポート番号: 8195)

SSH Profile

SSH profile設定例

zowe.config.json
...
    "profiles": {
        "odeinst1": {
            "properties": {
                "host": "odeinst1",
                "rejectUnauthorized": false
            },
            "profiles": {
                "zosmf": {
                    "type": "zosmf",
                    "properties": {
                        "port": 10443,
                        "encoding": "IBM-1399"
                    },
                    "secure": ["user", "password"]
                },
                "ssh": {
                    "type": "ssh",
                    "properties": {
                        "port": 2022,
                        "user": "DEV01",
                        "privateKey": "C:\\Users\\TomohiroTaguchi\\.ssh\\eeZdev_ISECloud\\id_rsa_DEV01"
                    }
                },
...

基本的にSSHプロファイルを単体で使うことはないと思いますので、z/OSMFプロファイルと合わせて同じホスト名に対してSSHプロファイルを追加する例を示しています。
DEV01ユーザーで鍵認証をする場合の設定例です。
事前にキーペアを作成しておき、Public KeyはUSS上のDEV01ユーザーのホームディレクトリ以下に適切にセットアップされている前提で、プロパティとしてはユーザーIDとPrivate Keyを指定しています。

接続確認例

上の構成を行うと、ZOWE EXPLORER view のデータ・セットの欄に 接続先としてodeinst1.zosmfというエントリーが追加されます。
接続確認のためにデータセットをVS Codeから参照してみます。
odeinst1.zosmfの横の虫メガネアイコン(データセットの検索)をクリックします。
image.png

最初にアクセスする際にはユーザーID/パスワードの入力が求められますのでガイドに従って入力します。(z/OSMF使用権原のあるユーザー/パスワードを指定)
image.png

image.png

参照したいデータセットのキーワードを入力します。ここでは「DEV01.*」を指定します。
image.png

指定したHLQのデータセット一覧が表示されました。
image.png

適当なメンバー(COBOLソース)を選択してみます。VS Codeのエディターで開くことが確認できました。
image.png

同じようなイメージで、USSのファイルやJOB関連の操作も行えます。

※ここでの接続確認は、上の構成ファイルで定義した内容のうちz/OSMFに関するものです。

構成ファイル補足

ファイルの構造について

デフォルトで作成されるプロファイルは、複数の接続先を想定していないような感じの例になっています。
環境によっては、複数環境に対してそれぞれプロファイルを指定して接続したい場合もありますし、1つの環境に対して複数プロトコルのプロファイルを定義する場合がありますので、接続先ホスト名に対して各プロトコルごとの階層を作って接続構成を行うような定義の仕方が分かりやすいと思います。例えば、以下のような定義の仕方が可能です。

image.png

1つの接続先に対して複数プロトコルのプロファイルを指定する例
zowe.config.json
{
    "$schema": "./zowe.schema.json",
    "profiles": {
        "odeinst1": {
            "properties": {
                "host": "odeinst1",
                "rejectUnauthorized": false
            },
            "profiles": {
                "zosmf": {
                    "type": "zosmf",
                    "properties": {
                        "port": 10443,
                        "encoding": "IBM-939"
                    },
                    "secure": ["user", "password"]
                },
                "ssh": {
                    "type": "ssh",
                    "properties": {
                        "port": 2022,
                        "user": "TAG",
                        "privateKey": "C:\\Users\\TomohiroTaguchi\\.ssh\\eeZdev_ISECloud\\id_rsa_odeinst1_root"
                    }
                },
                "rse": {
                    "type": "rse",
                    "properties": {
                        "port": 8195,
                        "basePath": "rseapi",
                        "protocol": "https"
                    },
                    "secure": ["user", "password"]
                },
                "tso": {
                    "type": "tso",
                    "properties": {
                        "account": "ACCT001"
                    }
                }
            }
        }
    },
    "defaults": {
        "zosmf": "odeinst1.zosmf"
    },
    "autoStore": true
}

サーバー証明書のチェックについて

z/OSMFと接続する際のプロトコルとしては通常https、すなわちTLS通信が行われます。この時、デフォルトではz/OSMF側から送られてくるサーバー証明書のチェックが行われます。具体的には、以下のようなチェックが行われます。

  • そのサーバー証明書がそのサーバー証明書が信頼された認証局により署名されているか
  • アクセスしているホスト名のドメインがサーバー証明書に記載されているドメイン名(Subject Alternate Name)と一致しているか

つまり、事前に、送られてくるサーバー証明を発行した認証局のCA証明書を"信頼できるルート証明機関"として登録しておき、かつ、サーバー証明書のSANには正しいドメイン名を設定しておく必要があります。証明書の管理はそれなりに負荷がかかりますので、一時的なテスト環境の場合や、セキュリティリスクが低いと判断されるある程度閉じた環境(中間者攻撃等のリスク等が少ないと判断されるような環境)では、このサーバー証明書のチェックをバイパスするということも可能です。
それを制御するのが rejectUnauthorized プロパティです。デフォルトでは rejectUnauthorized: trueとなっておりサーバー証明書のチェックが行われてチェックが通らない場合は接続を破棄します。チェックをバイパスしたい場合は rejectUnauthorized: false を指定する必要があります。

これは、ブラウザからあるサイトにhttpsでアクセスしたときに一旦証明書不正の警告がでたけれども、警告を無視してそのままアクセスする、という操作をするのと同じイメージです。

ユーザーID/パスワード情報の管理

z/OSMF経由でz/OSに接続して各種操作を行う場合、基本的にはTSOユーザーを作成しておき、ユーザーID/パスワードでログインして使用するということになります。
接続時に毎回ユーザーID/パスワードを入力する運用が面倒な場合、それを保持しておくことができます。それが autoStore: true で制御できます。これはユーザーID/パスワードに限りませんが、何か操作をしようとしたときに不足している情報があると、その入力を促すプロンプトが画面上に表示されます。それを自動的に保持するかどうかを制御するものです。ただ、デフォルトだとこの情報は zowe.config.json ファイルに平文で保存されてしまいます。パスワード情報をテキストファイルに平文で保持するのはセキュリティ上あまり望ましくありません。

参考:
Storing properties automatically
Configuring Zowe CLI where secure credential storage is not available

平文で保持してほしくない情報については、secure というプロパティで制御することができ、ここで指定したプロパティの情報についてはセキュアなストレージに情報が保持されることになります。
例えば、secure: ["user", "password"] と指定すると、ユーザーID、パスワードの情報は、WindowsであればOS提供の"資格情報マネージャー"に保持されます。

参考:
Managing credential security
Creating Zowe Explorer profiles - Managing profiles

セキュアなストレージに保持された資格情報(ユーザーID, パスワード)は、Zowe Explorer Viewのプロファイルを右クリック - [プロファイルの管理] - [資格情報の更新] から更新できます。

image.png
image.png

パスワードがExpireした場合の挙動

TSOユーザーのパスワードは、ある一定期間の有効期限を設けてそれが過ぎた場合更新を行わせる、という運用を行う場合があります。

例えば、PCOMでログインしようとした場合、以下のように新しいパスワードのセットが促されます。
image.png

このような状況でz/OSMFもしくはRSEプロファイル経由で接続しようとすると、以下のようなエラーで接続できない状態となります。

z/OSMF
image.png

RSE
image.png

これに関しては、例えばz/OSMFについて以下のようなIssueが起票されています。
GitHub Issue #3081: Provide more info in response to authentication errors and allow users to update password on mainframe

上のIssueを見ると、新しいパスワードを設定できるような改善要望が含まれますが、残念ながら Closed as not planned となっているので今のところ実装される可能性は低そうです。

パスワード変更スクリプト

Zowe Explorerではパスワード変更のUIが提供されていないようなので、別途パスワード変更用の仕組みを考えてみます。z/OSMFではバスワード変更用のREST APIが提供されているので、こちらをcurlコマンドで発行するPowerShellスクリプトを作成してみました。
必要であればこのような追加の運用の仕組みを検討するとよいと思います。

参考:
Change the user password or passphrase
PH34912: NEW FUNCTION - z/OSMF enhancements on the desktop UI and changing password

パスワード変更用PowerShellスクリプト
zosmf-change-password.ps1
# zosmf-change-password.ps1
# z/OSMF パスワード変更: PUT /zosmf/services/authenticate
# 仕様: Content-Type: application/json, X-CSRF-ZOSMF-HEADER 必須, JSON { userID, oldPwd, newPwd }  
# 変更機能は APAR PH34912 のPTFが必要  [1](https://marketplace.visualstudio.com/items?itemName=Zowe.vscode-extension-for-zowe)

[CmdletBinding()]
param(
  [Parameter(Mandatory=$true)]
  [string]$HostName,

  [Parameter(Mandatory=$false)]
  [int]$Port = 443,

  [Parameter(Mandatory=$false)]
  [switch]$InsecureTLS,  # 自己署名などで -k 相当を使う場合

  [Parameter(Mandatory=$false)]
  [string]$ZosmfBasePath = "" # 例: "/zosmf" が必要な環境なら指定(通常は空でOK)
)

function ConvertFrom-SecureStringToPlain([SecureString]$sec) {
  $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($sec)
  try { [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr) }
  finally { [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr) }
}

try {
  if (-not (Get-Command curl.exe -ErrorAction SilentlyContinue)) {
    throw "curl.exe が見つかりません。Windows 標準の curl が使える環境か確認してください。"
  }

  Write-Host "=== z/OSMF パスワード変更 (PUT /zosmf/services/authenticate) ===" -ForegroundColor Cyan
  Write-Host "Host: $HostName  Port: $Port" -ForegroundColor Gray

  $userId = Read-Host "User ID"
  $oldSec = Read-Host "Current Password/Passphrase" -AsSecureString
  $newSec = Read-Host "New Password/Passphrase" -AsSecureString

  # 平文へ(送信のため一時的に必要)
  $oldPwd = ConvertFrom-SecureStringToPlain $oldSec
  $newPwd = ConvertFrom-SecureStringToPlain $newSec

  # JSONボディ(userID/oldPwd/newPwd)
  $bodyObj = @{
    userID = $userId
    oldPwd = $oldPwd
    newPwd = $newPwd
  }
  $jsonBody = $bodyObj | ConvertTo-Json -Compress
  
  # JSONボディを一時ファイルに保存(PowerShellの配列展開問題を回避)
  # BOMなしのUTF-8で保存(z/OSMFはBOMを解析できない)
  $tempFile = Join-Path $env:TEMP "zosmf-change-password-$PID.json"
  $utf8NoBom = New-Object System.Text.UTF8Encoding $false
  [System.IO.File]::WriteAllText($tempFile, $jsonBody, $utf8NoBom)

  # API URL(PUT /zosmf/services/authenticate)
  # z/OSMF 認証サービス: PUT /zosmf/services/authenticate [1](https://marketplace.visualstudio.com/items?itemName=Zowe.vscode-extension-for-zowe)
  $url = "https://$HostName`:$Port$ZosmfBasePath/zosmf/services/authenticate"

  # curl 引数
  $curlArgs = @(
    "-sS",
    "-X", "PUT", $url,
    "-u", "$userId`:$oldPwd",                             # Basic認証(現在の資格情報で認証)
    "-H", "Origin: https://$HostName`:$Port",            # CSRF対策: Originヘッダー
    "-H", "Referer: https://$HostName`:$Port/zosmf/",    # CSRF対策: Refererヘッダー
    "-H", "Content-Type: application/x-www-form-urlencoded",  # IBM Docsのサンプルに従う
    "-H", "X-CSRF-ZOSMF-HEADER: ",                        # 必須、値は任意/空でも可
    "-d", "@$tempFile",
    "-w", "`nHTTP_STATUS=%{http_code}`n"
  )
  if ($InsecureTLS) { $curlArgs = @("-k") + $curlArgs }

  Write-Host "`nRequesting..." -ForegroundColor Yellow

  # 実行(結果取り込み)
  $output = & curl.exe @curlArgs 2>&1
  $statusLine = ($output | Select-String -Pattern "^HTTP_STATUS=" | Select-Object -Last 1).ToString()
  $httpStatus = [int]($statusLine -replace "HTTP_STATUS=", "").Trim()

  # レスポンスボディ(HTTP_STATUS 行を除去)
  $bodyLines = $output | Where-Object { $_ -notmatch "^HTTP_STATUS=" }
  $respBody = ($bodyLines -join "`n").Trim()

  Write-Host "`n--- Result ---" -ForegroundColor Cyan
  Write-Host "HTTP Status: $httpStatus" -ForegroundColor Gray

  if ($httpStatus -eq 200) {
    Write-Host "✅ Success: Password/Passphrase was changed." -ForegroundColor Green
    if ($respBody) {
      Write-Host "Response:" -ForegroundColor Gray
      Write-Host $respBody
    }
  }
  else {
    Write-Host "❌ Failed." -ForegroundColor Red
    if ($respBody) {
      Write-Host "Response:" -ForegroundColor Gray
      Write-Host $respBody
    } else {
      Write-Host "No response body." -ForegroundColor Gray
    }
    
    # HTTPステータスに応じたヒントメッセージ
    Write-Host ""
    if ($httpStatus -eq 0) {
      # 証明書エラーかどうかを判定
      $isCertError = $respBody -match "(certificate|SSL|TLS|schannel|SEC_E_|verify the legitimacy)"
      
      if ($isCertError) {
        Write-Host "Hint: SSL/TLS証明書の検証に失敗しました。" -ForegroundColor Yellow
        Write-Host "  自己署名証明書または検証できない証明書を使用している場合は、" -ForegroundColor Yellow
        Write-Host "  -InsecureTLS オプションを追加して実行してください:" -ForegroundColor Yellow
        Write-Host "  例: .\zosmf-change-password.ps1 -HostName $HostName -Port $Port -InsecureTLS" -ForegroundColor Cyan
      }
      else {
        Write-Host "Hint: サーバーに接続できませんでした。以下を確認してください:" -ForegroundColor Yellow
        Write-Host "  - ホスト名が正しいか (現在: $HostName)" -ForegroundColor Yellow
        Write-Host "  - ポート番号が正しいか (現在: $Port)" -ForegroundColor Yellow
        Write-Host "  - ネットワーク接続またはファイアウォールの設定" -ForegroundColor Yellow
      }
    }
    elseif ($httpStatus -eq 401) {
      Write-Host "Hint: 認証に失敗しました。ユーザーIDまたは現在のパスワードが間違っている可能性があります。" -ForegroundColor Yellow
    }
    elseif ($httpStatus -eq 403) {
      Write-Host "Hint: アクセスが拒否されました。" -ForegroundColor Yellow
      Write-Host "  リモートサイトからのアクセスが許可されていない可能性があります。" -ForegroundColor Yellow
      Write-Host "  z/OSMF管理者に連絡して、CORS設定またはリモートアクセス許可の確認を依頼してください。" -ForegroundColor Yellow
    }
    elseif ($httpStatus -eq 404) {
      Write-Host "Hint: APIエンドポイントが見つかりません。z/OSMFのバージョンやベースパスの設定を確認してください。" -ForegroundColor Yellow
    }
    elseif ($httpStatus -eq 500) {
      # HTTP 500の場合、レスポンスボディの内容に応じて適切なヒントを表示
      if ($respBody -match "not in JSON format") {
        Write-Host "Hint: JSON形式のエラーが発生しました。" -ForegroundColor Yellow
        Write-Host "  この問題は通常、スクリプト内部で自動的に処理されます。" -ForegroundColor Yellow
        Write-Host "  それでもエラーが発生する場合は、スクリプトの最新版を使用しているか確認してください。" -ForegroundColor Yellow
      }
      elseif ($respBody -match "Check whether the user ID and old") {
        Write-Host "Hint: パスワード変更に失敗しました。" -ForegroundColor Yellow
        Write-Host "  ユーザーIDまたは現在のパスワードが間違っている可能性があります。" -ForegroundColor Yellow
        Write-Host "  または新しいパスワードがパスワードポリシーに従っていない可能性があります。" -ForegroundColor Yellow
      }
      elseif ($respBody -match "newPwd is invalid") {
        Write-Host "Hint: 新しいパスワードが無効です。" -ForegroundColor Yellow
        Write-Host "  以下を確認してください:" -ForegroundColor Yellow
        Write-Host "  - パスワードポリシーに準拠しているか" -ForegroundColor Yellow
        Write-Host "  - パスワードとパスフレーズを混在させていないか" -ForegroundColor Yellow
        Write-Host "  - パスワード変更の最小間隔が経過しているか" -ForegroundColor Yellow
      }
      else {
        Write-Host "Hint: 予期しないエラーが発生しました。" -ForegroundColor Yellow
        Write-Host "  詳細についてはResponse内容を確認するか、z/OSMF管理者に連絡してください。" -ForegroundColor Yellow
      }
    }
    else {
      Write-Host "Hint: 予期しないエラーが発生しました。z/OSMF管理者に連絡してください。" -ForegroundColor Yellow
    }
  }

} finally {
  # 一時ファイルを削除
  if (Test-Path $tempFile) {
    Remove-Item $tempFile -Force -ErrorAction SilentlyContinue
  }
  
  # できる範囲で平文を破棄(完全消去は保証できないが、変数上書きで痕跡を減らす)
  $oldPwd = $null
  $newPwd = $null
  $jsonBody = $null
  [GC]::Collect()
}

簡易実行用バッチ

上のPowerShellスクリプトを実行するバッチ

zosmf-change-password.bat
@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0"

REM ========================================
REM 設定: ここを環境に合わせて変更してください
REM ========================================
set HOSTNAME=odeinst1
set PORT=10443
REM ========================================

REM PowerShellスクリプトを実行(実行ポリシーをバイパス)
powershell.exe -ExecutionPolicy Bypass -File ".\zosmf-change-password.ps1" -HostName %HOSTNAME% -Port %PORT% -InsecureTLS

REM エラーコードを確認
if %ERRORLEVEL% neq 0 (
    echo.
    echo エラーが発生しました。終了コード: %ERRORLEVEL%
    pause
    exit /b %ERRORLEVEL%
)

echo.
echo 処理が完了しました。
pause
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?