情報処理安全確保支援士は、1年に1度の共通講習(オンライン講習)と、3年に1度の実践講習(実践講習または特定講習)を受講する義務があります*1。この講習を受講するには3年間で14万円かかります*2。企業や組織に所属する情報処理安全確保支援士の場合、この費用を会社が負担することもあるようです*3。この場合、受講費用を各年度の予算に組込む必要があるわけですが、それにあたって以下のような不明点が挙がることもあるでしょう。
- 前回の実践講習受講から3年経ったら再度受講しないといけないが、前回の受講はいつだろう?
- 登録から3年以内に実践講習を受講しないといけないが、受講の期限はいつだろう?
- 共通講習の案内が来るのは、4月と10月のどちらだろう?
そこで、情報処理安全確保支援士の登録番号と、対象の期(10月1日か4月1日)を与えると受講対象かそうでないか返すPowerShellスクリプトを作ってみました。
余談ですが、3月決算の会社の場合、10月に登録すると受講可能時期が期をまたぐので、10月~翌年3月に受講するか、4~9月に受講するかで費用が計上される年度が変わってしまうのが不便ですね……
# 認証付きプロキシサーバーを超えたい場合は以下を参照。 # https://qiita.com/earthdiver1/items/640cbb0d15d750968429 function Get-RISSRegistration { <# .SYNOPSIS 情報処理安全確保支援士の登録情報を取得する .DESCRIPTION 情報処理安全確保支援士検索サービスを利用して、 情報処理安全確保支援士の登録番号から登録情報を取得する。 .PARAMETER RegistrationNo 情報処理安全確保支援士の登録番号 .OUTPUTS PSObject. 情報処理安全確保支援士検索サービスのJSONをパースしたものを返す。 .EXAMPLE PS> Get-RISSRegistration "000006" reg_no : 000006 reg_date : 2017-04-01 last_name : first_name : ... update_deadline : 2023-09-30 update_cnt : 1回 online_attendance_date : 2021-01-10 real_attendance_date : 2019-09-06 ... .LINK 情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp #> Param( [Parameter(ValueFromPipeline=$true,Mandatory=$true)] [string] $RegistrationNo ) Begin { $Response = Invoke-WebRequest https://riss.ipa.go.jp/ajax/findRissRequest -Method Post -Body @{reg_no="${RegistrationNo}"} (ConvertFrom-Json $Response.Content).result } } function Get-AttendF2FCourse { <# .SYNOPSIS 情報処理安全確保支援士の実践講習受講要否を判定する .DESCRIPTION 情報処理安全確保支援士検索サービスで取得した前回の実践講習受講日をもとに 指定した時期の実践講習受講要否を判定する。 .PARAMETER RISSRegistration 情報処理安全確保支援士の登録情報 .PARAMETER Term 判定対象の時期。"YYYY-10-01"または"YYYY-04-01"。 .OUTPUTS Boolean. 実践講習受講時期の場合Trueを返す。 .EXAMPLE PS> Get-AttendF2FCourse (Get-RISSRegistration "000006") "2022-04-01" True .EXAMPLE PS> Get-AttendF2FCourse (Get-RISSRegistration "000006") "2022-10-01" False .LINK 情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp #> Param( [PSObject] $RISSRegistration, [string] $Term ) Begin { $CurrentTerm = [DateTime]$Term # 登録より前の日付の場合は対象外 if ($CurrentTerm -lt (Get-HalfFirstDate $RISSRegistration.reg_date)) { return $false } if ($RISSRegistration.real_attendance_date) { # 受講済みの場合はそこから3年後の半年間に受講し、以降3年ごとに受講 $PreviousAttendanceTerm = Get-HalfFirstDate $RISSRegistration.real_attendance_date if ($CurrentTerm.Month -eq $PreviousAttendanceTerm.Month) { return ($CurrentTerm.Year - $PreviousAttendanceTerm.Year) % 3 -eq 0 } } else { # 未受講の場合は登録から半年後の半年間に受講し、以降3年ごとに受講 $FirstTerm = (Get-HalfFirstDate $RISSRegistration.reg_date).AddMonths(6) if ($CurrentTerm.Month -eq $FirstTerm.Month) { return ($CurrentTerm.Year - $FirstTerm.Year) % 3 -eq 0 } } return $false; } } function Get-AttendOnlineCourse { <# .SYNOPSIS 情報処理安全確保支援士の共通講習(オンライン講習)受講要否を判定する .DESCRIPTION 情報処理安全確保支援士検索サービスで取得した前回の共通講習(オンライン講習)受講日をもとに 指定した時期の共通講習受講要否を判定する。 .PARAMETER RISSRegistration 情報処理安全確保支援士の登録情報 .PARAMETER Term 判定対象の時期。"YYYY-10-01"または"YYYY-04-01"。 .OUTPUTS Boolean. 共通講習受講時期の場合Trueを返す。 .EXAMPLE PS> Get-AttendOnlineCourse (Get-RISSRegistration "000006") "2021-10-01" True .EXAMPLE PS> Get-AttendOnlineCourse (Get-RISSRegistration "022906") "2022-04-01" False .LINK 情報処理安全確保支援士検索サービス: https://riss.ipa.go.jp #> Param( [PSObject] $RISSRegistration, [string] $Term ) Begin { $CurrentTerm = [DateTime]$Term # 登録より前の日付の場合は対象外 if ($CurrentTerm -lt (Get-HalfFirstDate $RISSRegistration.reg_date)) { return $false } if ($RISSRegistration.online_attendance_date) { # 受講済みの場合はそこから以降1年ごとに受講 $PreviousAttendanceTerm = Get-HalfFirstDate $RISSRegistration.online_attendance_date return $CurrentTerm.Month -eq $PreviousAttendanceTerm.Month } else { # 未受講の場合は登録からの半年間に受講し、以降1年ごとに受講 $FirstTerm = Get-HalfFirstDate $RISSRegistration.reg_date return $CurrentTerm.Month -eq $FirstTerm.Month } return $false; } } function Get-HalfFirstDate { <# .SYNOPSIS 与えられた日付の期の初日を取得する(4月始まり) .DESCRIPTION 日付を与えると、該当する期の初日を返す。 .PARAMETER Date 任意の日付 .OUTPUTS DateTime. 該当する期の初日(4月1日、または10月1日)を返す。 .EXAMPLE PS> > Get-HalfFirstDate "2021-08-30" 2021年4月1日 0:00:00 .EXAMPLE PS> Get-HalfFirstDate "2022-01-31" 2021年10月1日 0:00:00 #> [OutputType([DateTime])] Param( [Parameter(ValueFromPipeline=$true,Mandatory=$true)] [string] $Date ) Begin { $DateTime = [DateTime]$Date $Month = $DateTime.Month if (4 -le $Month -and $Month -le 9) { return [DateTime]::new($DateTime.Year, 4, 1, 0, 0, 0) } elseif (10 -le $Month -and $Month -le 12) { return [DateTime]::new($DateTime.Year, 10, 1, 0, 0, 0) } elseif (1 -le $Month -and $Month -le 3) { return [DateTime]::new($DateTime.Year-1, 10, 1, 0, 0, 0) } } }