WYMB
WYMB

Reputation: 15

Script to add days to a parameter

I need assistance creating a PowerShell script to expire a users account and add an Out of Office Message to Exchange for 30 days after the expiration date. Below is what I have so far:

Param(
    $mailbox   = $(Read-Host "you must enter the first part of the email address"), 
    $StartTime = $(Read-Host "Please enter the start date and time of account expiration in MM/DD/YYYY HH:MM:SS"), 
    $Username  = $(Read-Host "please enter the AS400 username"),
    $EndTime   = $StartTime.AddDays(30)
)

Set-ADAccountExpiration -Identity $Username -DateTime $StartTime;
Set-MailboxAutoReplyConfiguration -Identity $mailbox -AutoReplyState Scheduled -StartTime $StartTime -EndTime $EndTime -ExternalMessage "The Person you are trying to contact is no longer employed by the Company" -InternalMessage "The Person you are trying to contact is no longer employed by Company XYZ for further assistance please contact the your local Store."

Method invocation failed because [System.String] does not contain a method named 'AddDays'.

How do I create the methods or is there an easier way?

Upvotes: 0

Views: 736

Answers (2)

colsw
colsw

Reputation: 3326

I had some surprisingly similar code written for something a while back, I can't remember if this worked fully and I am unable to test right now, but you should at least be able to get an idea of how parsing the inputs and ensuring everything is valid is done here.

I've changed it around a bit to fit your use better, if the SamAccountName in AD is the same as the Email Alias then you just need to specify Mailbox and StartTime at minimum, it will "autodiscover" the AD account.

Any questions please let me know - and if there's an issue running i'll take a look tomorrow when i'm back in work.

Function Set-LeaverAccount {
    Param(
        [string]$MailBox = $null,
        [string]$StartTime = $null,
        [string]$UserName = $null,
        [string]$ExternalMessage = "The person you are emailing has left the company, please contact [email protected] for more details",
        [string]$InternalMessage = $null,
        [uint16]$OutOfOfficeDays = 30
    )

#region Parse Mailbox
    $MailBoxAlias = $MailBox
    if (!(Get-Mailbox $MailBox -EA SilentlyContinue)){
        do {
            $Input = Read-Host "Email Alias"
            $MailBox = Get-Mailbox $Input -EA SilentlyContinue
        } while (!$MailBox)
        Write-Host "Mailbox of $($MailBox.Name) Selected"
    } else { $Mailbox = Get-Mailbox }
#endregion

#region Parse DateTime
    if (![DateTime]::Parse($StartTime)){
        do {
            $Input = Read-Host "Date/Time of Expiration"
            [DateTime]$StartTime = [datetime]::MaxValue
        } while (![DateTime]::TryParse($Input,[ref]$StartTime))
        Write-Host "Start Time Set To $($StartTime.ToString())"
    }

    $EndTime = $StartTime.AddDays($OutOfOfficeDays)
#endregion

#region Parse AD Username
    if ($UserName -eq $null){
        $UserName = $MailBoxAlias #If not set use alias as AD Name
    }

    if (!(Get-AdUser $UserName -EA SilentlyContinue)){
        do {
            $Input = Read-Host "AD Username"
            $User = Get-AdUser $Input -EA SilentlyContinue
        } while ($User.count -ne 1)
        Write-Host "User $($User.Name) Selected"
    } else {
        $User = Get-AdUser $UserName
    }
#endregion
    if ($InternalMessage -eq $null) { $InternalMessage = $ExternalMessage }
    Set-ADAccountExpiration -Identity $User -DateTime $StartTime
    Set-MailboxAutoReplyConfiguration -Identity $Mailbox -AutoReplyState Scheduled -StartTime $StartTime -EndTime $EndTime -ExternalMessage $ExternalMessage -InternalMessage $InternalMessage
}

Set-LeaverAccount -MailBox "User01" -StartTime "12/02/16" -UserName "User_1" `
-ExternalMessage "The Person you are trying to contact is no longer employed by the Company" `
-InternalMessage "The Person you are trying to contact is no longer employed by Company XYZ for further assistance please contact the your local Store."

Upvotes: 0

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200193

Read-Host returns a string. String objects don't have a method AddDays(). You need to make $StartTime a DateTime value.

Change this:

Param(
    ...
    $StartTime = $(Read-Host "..."),
    ...
)

into this:

Param(
    ...
    [DateTime]$StartTime = $(Read-Host "..."),
    ...
)

Note that this only works, because input strings in the format you're asking for can be cast to DateTime. Otherwise you'd need to actually parse the string.

Upvotes: 0

Related Questions