MDeamon.psm1

#################################################
## ATTENTION!!! ##
## regsvr32 "C:\MDaemon\App\MDUserCOM.dll" /u ##
## regsvr32 "C:\MDaemon\App\MDUserCOM.dll" ##
#################################################

Function Get-MDUser {
    param (
        [string]$Email,
        [string]$Mailbox,
        [string]$FullName,
        [string]$Domain = $env:USERDNSDOMAIN,
        [switch]$All
    )

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}
    
    if ($All) {
        [int64[]]$id = @(1 .. [int64]($MDUser.UserCount()))
    } elseif ($Email) {
        [int64]$id = @($MDUser.GetByEmail($Email))[0]
    } elseif ($Mailbox) {
        [int64]$id = @($MDUser.GetByMailbox($Mailbox, $Domain))[0]
    } elseif ($FullName) {
        [int64]$id = @($MDUser.GetByFullName($FullName, $Domain))[0]
    } else {break}

    $id | % {
        $i = [int64]$_
        if ($i -gt 0){
            $MDUser = New-Object -ComObject MDUserCOM.MDUser
            $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

            $MDUser.GetUserInfo($_, $MDUserInfo)
            $MDUserInfo | Select-Object -Property @(@{'Name' = 'id'; 'Expression' = {$i}},'*')
        }
    }
}

Function Set-MDUser {

<#
.EXAMPLE
Get-MDUser -All | ? {$_.Comments -match [regex]::Escape($_.Password)} | % {$NewComments = $_.Comments -replace @([regex]::Escape($_.Password),'password'); Set-MDUser -Email $_.Email -Replace @{'Comments' = $NewComments} }
 
#>

    param (
        [string]$Email,
        [string]$Mailbox,
        [string]$FullName,
        [string]$Domain = $env:USERDNSDOMAIN,
        [hashtable]$Replace
    )

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}
    if ($Replace.Count -eq 0) {'Argument "Replace" error'; break}

    if ($Email) {
        [int64]$id = @($MDUser.GetByEmail($Email))[0]
    } elseif ($Mailbox) {
        [int64]$id = @($MDUser.GetByMailbox($Mailbox, $Domain))[0]
    } elseif ($FullName) {
        [int64]$id = @($MDUser.GetByFullName($FullName, $Domain))[0]
    } else {break}

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo
    
    $MDUser.GetUserInfo($id, $MDUserInfo)
    
    $Replace.GetEnumerator() | % {$MDUserInfo.($_.key) = $_.value}
    $MDUser.SetUserInfo($id, $MDUserInfo)
    
    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    $MDUser.GetUserInfo($id, $MDUserInfo)
    $MDUserInfo
    
}

Function Set-MDUserProtocol {
    param (
        [string]$Email,
        [string]$Mailbox,
        [string]$FullName,
        [string]$Domain = $env:USERDNSDOMAIN,
        [parameter(Mandatory=$true)][bool]$POP,
        [parameter(Mandatory=$true)][bool]$IMAP
    )
<#
.EXAMPLE
Get-MDUser -All | ? AccessType -eq 2 | % {Set-MDUserProtocol -Email $_.Email -POP $true -IMAP $true}
#>


    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}

    if ($Email) {$id = $MDUser.GetByEmail($Email)}
    if ($Mailbox) {$id = $MDUser.GetByMailbox($Mailbox, $Domain)}
    if ($FullName) {$id = $MDUser.GetByFullName($FullName, $Domain)}

    if ([int]$id -gt 0){
        $MDUser.SetAccessType($id, $POP, $IMAP)
        $MDUser.GetUserInfo($id, $MDUserInfo)
        $MDUserInfo
    }
}

Function Set-MDUserPassword {
    param (
        [string]$Email,
        [string]$Mailbox,
        [string]$FullName,
        [string]$Domain = $env:USERDNSDOMAIN,
        [string]$Password
    )

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}

    if ($Email) {$id = $MDUser.GetByEmail($Email)}
    if ($Mailbox) {$id = $MDUser.GetByMailbox($Mailbox, $Domain)}
    if ($FullName) {$id = $MDUser.GetByFullName($FullName, $Domain)}

    if ([int]$id -gt 0){
        $MDUser.SetPassword($id, $Password)
        $MDUser.GetUserInfo($id, $MDUserInfo)

        $MDUserInfo
    }
}

Function New-MDUser {
    param (
        [string]$FullName,
        [parameter(Mandatory=$true)][string]$Mailbox,
        [string]$Domain = $env:USERDNSDOMAIN,
        [string]$FwdDomain = '',
        [string]$Password = '123ABC',
        [ValidateSet('All','POP','IMAP')][string]$AccessType = 'All',
        [ValidateRange(0,1)][int]$ApplyQuotas = 1,
        [string]$MaxMessageCount = 0,
        [string]$MaxDiskSpace = 4000000,
        [string]$RootMailDir = 'D:\MDAEMON\Users\',
        [ValidateRange(0,1)][int]$KeepForwardedMail = 0,
        [string]$FwdAddress
    )

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}
    
    if ($FwdAddress) {
        $FwdAddress = $FwdAddress -replace @('@.+','') -replace @('\b$',$('@'+$FwdDomain))
        $MDUserInfo.FwdAddress = $FwdAddress
        $MDUserInfo.IsForwarding = 1
    }

    $Email = [string](@($Mailbox,$Domain) -join '@')
    $MailDir = Join-Path -Path $RootMailDir -ChildPath ($Domain + '\' + $Mailbox + '\')
    if (! $FullName) {$FullName = $Mailbox}

    $MDUserInfo.FullName  = $FullName
    $MDUserInfo.Mailbox   = $Mailbox
    $MDUserInfo.Email     = $Email
    $MDUserInfo.Domain    = $Domain
    $MDUserInfo.Password  = $Password
    $MDUserInfo.MailDir   = $MailDir
    $MDUserInfo.AccessType   = @{'All' = 1; 'POP' = 2; 'IMAP' = 3}[$AccessType]
    $MDUserInfo.WebConfig   = 1
    $MDUserInfo.ApplyQuotas   = $ApplyQuotas
    $MDUserInfo.MaxMessageCount   = $MaxMessageCount
    $MDUserInfo.MaxDiskSpace   = $MaxDiskSpace
    $MDUserInfo.KeepForwardedMail   = $KeepForwardedMail
    
    if ($MDUser.AddUser($MDUserInfo) -eq 0) {
        $MDUserInfo | Select-Object @{Name = 'Created'; Expression = {$true}},*
    } else {
        $MDUserInfo | Select-Object @{Name = 'Created'; Expression = {$false}},*
    }

}

Function Disable-MDUser {
    param (
        [string]$Email,
        [string]$Mailbox,
        [string]$FullName,
        [string]$Domain = $env:USERDNSDOMAIN
    )

    $MDUser = New-Object -ComObject MDUserCOM.MDUser
    $MDUserInfo = New-Object -ComObject MDUserCOM.MDUserInfo

    if (! $MDUser.LoadUserDll()) {'LoadUserDll error'; break}

    if ($Email) {$id = $MDUser.GetByEmail($Email)}
    if ($Mailbox) {$id = $MDUser.GetByMailbox($Mailbox, $Domain)}
    if ($FullName) {$id = $MDUser.GetByFullName($FullName, $Domain)}

    if ([int]$id -gt 0){
        $MDUser.SetIsDisabled($id, 1)
        $MDUser.GetUserInfo($id, $MDUserInfo)
        $MDUserInfo
    }
}