Functions/Accounts/Start-PASCredChange.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
function Start-PASCredChange {
    <#
.SYNOPSIS
Initiates an immediate password change by the CPM to a new random password.

.DESCRIPTION
Flags a managed account credentials for an immediate CPM password change.
The "Initiate CPM password management operations" permission is required.

.PARAMETER AccountID
The unique ID of the account to delete.
This is retrieved by the Get-PASAccount function.

.PARAMETER ImmediateChangeByCPM
Yes/No value, dictating if the account will be scheduled for immediate change.
Specify Yes to initiate a password change by CPM

.PARAMETER ChangeCredsForGroup
Yes/No value, dictating if all accounts that belong to the same group should
have their passwords changed.
This is only relevant for accounts that belong to an account group.
Parameter will be ignored if account does not belong to a group.

.PARAMETER sessionToken
Hashtable containing the session token returned from New-PASSession

.PARAMETER WebSession
WebRequestSession object returned from New-PASSession

.PARAMETER BaseURI
PVWA Web Address
Do not include "/PasswordVault/"

.PARAMETER PVWAAppName
The name of the CyberArk PVWA Virtual Directory.
Defaults to PasswordVault

.EXAMPLE
$token | Start-PASCredChange -AccountID 21_3 -ImmediateChangeByCPM Yes

Will mark account with ID of "21_3" for immediate password change by CPM

.EXAMPLE
$token | Get-PASAccount xAccount | Start-PASCredChange -ImmediateChangeByCPM Yes

Will mark xAccount for immediate password change by CPM

.INPUTS
SessionToken, AccountID, WebSession & BaseURI can be piped by property name

.OUTPUTS
None

.NOTES

.LINK

#>

    [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingPlainTextForPassword', 'ChangeCredsForGroup', Justification = "Parameter does not hold password")]
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true
        )]
        [ValidateNotNullOrEmpty()]
        [Alias("id")]
        [string]$AccountID,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $false
        )]
        [ValidateSet('Yes', 'No')]
        [string]$ImmediateChangeByCPM,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $false
        )]
        [ValidateSet('Yes', 'No')]
        [string]$ChangeCredsForGroup,

        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true
        )]
        [ValidateNotNullOrEmpty()]
        [hashtable]$sessionToken,

        [parameter(
            ValueFromPipelinebyPropertyName = $true
        )]
        [Microsoft.PowerShell.Commands.WebRequestSession]$WebSession,

        [parameter(
            Mandatory = $true,
            ValueFromPipelinebyPropertyName = $true
        )]
        [string]$BaseURI,

        [parameter(
            Mandatory = $false,
            ValueFromPipelinebyPropertyName = $true
        )]
        [string]$PVWAAppName = "PasswordVault"
    )

    BEGIN {

        #Create empty hashtable to hold objects for header
        #CredChange header is non-standard
        $header = @{ }

    }#begin

    PROCESS {

        #Create URL for request
        $URI = "$baseURI/$PVWAAppName/WebServices/PIMServices.svc/Accounts/$AccountID/ChangeCredentials"

        #Header is normally just session token
        $header = $SessionToken

        #Get parameters to include in request body
        $boundParameters = $PSBoundParameters |

        #ImmediateChangeByCPM must be sent in the request header
        #remove it from the body of the request
        Get-PASParameter -ParametersToRemove "ImmediateChangeByCPM", AccountID

        #add ImmediateChangeByCPM to header as key=value pair
        $header["ImmediateChangeByCPM"] = $ImmediateChangeByCPM

        #create request body
        $body = $boundParameters | ConvertTo-Json

        if ($PSCmdlet.ShouldProcess($AccountID, "Mark for Immediate Change by CPM")) {

            #send request to web service
            Invoke-PASRestMethod -Uri $URI -Method PUT -body $body -Headers $header -WebSession $WebSession

        }

    }#process

    END { }#end

}