2atCrm.psm1

#Requires -Version 4.0 -Modules 2atGeneral

$PSDefaultParameterValues.Clear()
Set-StrictMode -Version 2.0

Import-Module (Join-Path -Path $PSScriptRoot -ChildPath Microsoft.Xrm.Sdk.dll)
Import-Module (Join-Path -Path $PSScriptRoot -ChildPath Microsoft.Crm.Sdk.Proxy.dll)
Import-Module 2atGeneral

Function Get-OrgServiceProxy {
    Param (
        [Parameter(Mandatory=$true)]
        $OrgServiceUri,

        [Parameter(Mandatory=$true)]
        $Credentials
    )
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState

    if ($Credentials -is [PSCredential]) {
        $Credentials = $Credentials.GetNetworkCredential()
    }
    if ($Credentials -is [System.Net.NetworkCredential]) {
        $ccred = New-Object System.ServiceModel.Description.ClientCredentials
        $ccred.UserName.UserName = $Credentials.UserName
        $ccred.UserName.Password = $Credentials.Password
        $Credentials = $ccred
    }
    if ($Credentials -isnot [System.ServiceModel.Description.ClientCredentials]) {
        throw "Session credentials specified are of an unsupported type: $($Credentials.GetType().FullName), please use either a PSCredential, a NetworkCredential or a ClientCredentials"
    }

    Write-Verbose "Creating Proxy for uri: $OrgServiceUri and user: $($Credentials.UserName.UserName)"
    New-Object Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy($OrgServiceUri, $null, $Credentials, $null)
}

Function Get-CrmRecord {
    Param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy]
        $OrgServiceProxy,
        
        [Parameter(Mandatory=$true)]
        [string]
        $FetchXml
    )
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState

    $OrgServiceProxy.RetrieveMultiple((New-Object Microsoft.Xrm.Sdk.Query.FetchExpression($FetchXml))).Entities
}

Function New-CrmRecord {
    Param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy]
        $OrgServiceProxy,

        [Parameter(Mandatory=$true)]
        [string]
        $Entity,

        $Attributes
    )
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
    Write-Debug "New-CrmRecord: About to create $Entity"

    $e = New-Object Microsoft.Xrm.Sdk.Entity($Entity)
    $Attributes.Keys | %{ $e[$_]=$Attributes[$_] }

    $n = $OrgServiceProxy.Create($e)

    $c = New-Object Microsoft.Xrm.Sdk.Query.ColumnSet
    $Attributes.Keys | %{ $c.Columns.Add($_) }
    $OrgServiceProxy.Retrieve($Entity, $n, $c)
}

Function Edit-CrmRecord {
    Param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy]
        $OrgServiceProxy,

        [Microsoft.Xrm.Sdk.Entity]
        $Record,

        $AttributeUpdates
    )

    $u = New-Object Microsoft.Xrm.Sdk.Entity($Record.LogicalName)
    $u["$($Record.LogicalName)id"]=$Record["$($Record.LogicalName)id"]
    $AttributeUpdates.Keys | %{ $u[$_]=$AttributeUpdates[$_] }
    $OrgServiceProxy.Update($u)

    $c = New-Object Microsoft.Xrm.Sdk.Query.ColumnSet
    $Record.Attributes.Keys | %{ $c.Columns.Add($_) }
    $AttributeUpdates.Keys | %{ $c.Columns.Add($_) }
    $OrgServiceProxy.Retrieve($Record.LogicalName, $Record.Id, $c)
}

Function New-CrmListMember {
    Param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy]
        $OrgServiceProxy,

        [Parameter(Mandatory=$true)]
        [Guid]
        $ListId,

        [Parameter(Mandatory=$true)]
        [Guid]
        $MemberId
    )
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
    Write-Debug "New-CrmListMember: About to add member $MemberId to list $ListId"

    $m = New-Object Microsoft.Crm.Sdk.Messages.AddMemberListRequest
    $m.EntityId = $MemberId
    $m.ListId = $ListId
    [void]$OrgServiceProxy.Execute($m)
}

Function Close-CrmRecord {
    Param (
        [Parameter(Mandatory=$true)]
        [Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy]
        $OrgServiceProxy,

        [Microsoft.Xrm.Sdk.Entity]
        $Record
    )
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
    Write-Debug "Close-CrmRecord: about to close $($Record.LogicalName) with id=$($Record.Id)"

    $r = New-Object Microsoft.Crm.Sdk.Messages.SetStateRequest
    $r.EntityMoniker = New-Object Microsoft.Xrm.Sdk.EntityReference($Record.LogicalName, $Record.Id)
    $r.State = New-Object Microsoft.Xrm.Sdk.OptionSetValue(1)  # State 1: Closed
    $r.Status = New-Object Microsoft.Xrm.Sdk.OptionSetValue(2) # Status 2: Closed

    [void]$OrgServiceProxy.Execute($r)
}

Export-ModuleMember -Function Close-*
Export-ModuleMember -Function New-*
Export-ModuleMember -Function Edit-*
Export-ModuleMember -Function Get-*

# SIG # Begin signature block
# MIIWcAYJKoZIhvcNAQcCoIIWYTCCFl0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDCPfqPUsRFkeQ2
# KVFxmldK7oGRVTGF78i+haPQV9Sl1aCCCxswggUzMIIEG6ADAgECAhEAgNHe/U3D
# BzyckFGAgIDcJDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJHQjEbMBkGA1UE
# CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQK
# ExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNp
# Z25pbmcgQ0EwHhcNMTcwMTEzMDAwMDAwWhcNMjAwMTEzMjM1OTU5WjCBgDELMAkG
# A1UEBhMCTkwxEDAOBgNVBBEMBzM1NDIgRFoxEDAOBgNVBAgMB1V0cmVjaHQxEDAO
# BgNVBAcMB1V0cmVjaHQxFTATBgNVBAkMDEVuZXJnaWV3ZWcgMTERMA8GA1UECgwI
# MkFUIEIuVi4xETAPBgNVBAMMCDJBVCBCLlYuMIIBIjANBgkqhkiG9w0BAQEFAAOC
# AQ8AMIIBCgKCAQEAzB3KZ2CBenaD2WDwOsy0cHE6mLIeIYqWP718FuWeUZ5eejvw
# 8BozajbtBWgISZ2IMsTYZ1I7KFBzHgXXkNglmyboa6++x7j2Ws+T0hmHCUZ64AFb
# OkXjqYsOBCPhi3yuKIRLwc4snA3F3DCH24mBpDYymrU22+0vMIlDqpzRXBNEeIhG
# ss3jehu86l85fWVS54F5KGeDYQ2BT0Tc0UO6hMlcpCEVKIbthLm36q1/oSchRYjH
# B4JCT1KqACRhD0hJcQmTcJZvhpgOrglUVlj1ClS5xfWgHq3ySShOOZMecl0VNMtY
# xNi5TF1Ae+sie4044ioyGB6dGItGXwhObIk/9wIDAQABo4IBqDCCAaQwHwYDVR0j
# BBgwFoAUKZFg/4pN+uv5pmq4z/nmS71JzhIwHQYDVR0OBBYEFDHc2o80OMg8zNfF
# WMH8QB57E7rnMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQM
# MAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIBAQQEAwIEEDBGBgNVHSAEPzA9MDsGDCsG
# AQQBsjEBAgEDAjArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8u
# bmV0L0NQUzBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNv
# bS9DT01PRE9SU0FDb2RlU2lnbmluZ0NBLmNybDB0BggrBgEFBQcBAQRoMGYwPgYI
# KwYBBQUHMAKGMmh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUNvZGVT
# aWduaW5nQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5j
# b20wGQYDVR0RBBIwEIEOc3VwcG9ydEAyYXQubmwwDQYJKoZIhvcNAQELBQADggEB
# AHGDJyOKLJwzdt4Y8ow7H4ZKZXs9Hopf0GhizzhcPWyWL7GI6QHhKHzFWYGsFhh2
# vesuY7p89jthK5YqSn1u2KUQuLWzQZQj3cZCK2BwSz6FpgmmjqIo49qCfKIB5IrE
# DcZAQPC9wxaXPI+R3B32JmTllBpkFQNTIJVcB7jR/Ft991iV17tMMq0GssMAHnVd
# /yvTWlUaE7XNtgtNYQ5v/8HxxNtdBXsIbdjiv/A8GjUmyPN8Dum9CW82hUqOE7U9
# AXHZIBWy9yrooSieo26GA1OzrBvnDc+L42JZnjvwdhBqSnbQrSS7L6VjVHU+Ct84
# Fnb5u23Jypdmj9123Hw9qJwwggXgMIIDyKADAgECAhAufIfMDpNKUv6U/Ry3zTSv
# MA0GCSqGSIb3DQEBDAUAMIGFMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl
# ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8g
# Q0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1
# dGhvcml0eTAeFw0xMzA1MDkwMDAwMDBaFw0yODA1MDgyMzU5NTlaMH0xCzAJBgNV
# BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh
# bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01P
# RE8gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
# AQoCggEBAKaYkGN3kTR/itHd6WcxEevMHv0xHbO5Ylc/k7xb458eJDIRJ2u8UZGn
# z56eJbNfgagYDx0eIDAO+2F7hgmz4/2iaJ0cLJ2/cuPkdaDlNSOOyYruGgxkx9hC
# oXu1UgNLOrCOI0tLY+AilDd71XmQChQYUSzm/sES8Bw/YWEKjKLc9sMwqs0oGHVI
# wXlaCM27jFWM99R2kDozRlBzmFz0hUprD4DdXta9/akvwCX1+XjXjV8QwkRVPJA8
# MUbLcK4HqQrjr8EBb5AaI+JfONvGCF1Hs4NB8C4ANxS5Eqp5klLNhw972GIppH4w
# vRu1jHK0SPLj6CH5XkxieYsCBp9/1QsCAwEAAaOCAVEwggFNMB8GA1UdIwQYMBaA
# FLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBQpkWD/ik366/mmarjP+eZL
# vUnOEjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE
# DDAKBggrBgEFBQcDAzARBgNVHSAECjAIMAYGBFUdIAAwTAYDVR0fBEUwQzBBoD+g
# PYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ2VydGlmaWNhdGlv
# bkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRw
# Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FBZGRUcnVzdENBLmNydDAkBggr
# BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
# A4ICAQACPwI5w+74yjuJ3gxtTbHxTpJPr8I4LATMxWMRqwljr6ui1wI/zG8Zwz3W
# GgiU/yXYqYinKxAa4JuxByIaURw61OHpCb/mJHSvHnsWMW4j71RRLVIC4nUIBUzx
# t1HhUQDGh/Zs7hBEdldq8d9YayGqSdR8N069/7Z1VEAYNldnEc1PAuT+89r8dRfb
# 7Lf3ZQkjSR9DV4PqfiB3YchN8rtlTaj3hUUHr3ppJ2WQKUCL33s6UTmMqB9wea1t
# QiCizwxsA4xMzXMHlOdajjoEuqKhfB/LYzoVp9QVG6dSRzKp9L9kR9GqH1NOMjBz
# wm+3eIKdXP9Gu2siHYgL+BuqNKb8jPXdf2WMjDFXMdA27Eehz8uLqO8cGFjFBnfK
# S5tRr0wISnqP4qNS4o6OzCbkstjlOMKo7caBnDVrqVhhSgqXtEtCtlWdvpnncG1Z
# +G0qDH8ZYF8MmohsMKxSCZAWG/8rndvQIMqJ6ih+Mo4Z33tIMx7XZfiuyfiDFJN2
# fWTQjs6+NX3/cjFNn569HmwvqI8MBlD7jCezdsn05tfDNOKMhyGGYf6/VXThIXcD
# Cmhsu+TJqebPWSXrfOxFDnlmaOgizbjvmIVNlhE8CYrQf7woKBP7aspUjZJczcJl
# mAaezkhb1LU3k0ZBfAfdz/pD77pnYf99SeC7MH1cgOPmFjlLpzGCCqswggqnAgEB
# MIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx
# EDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMw
# IQYDVQQDExpDT01PRE8gUlNBIENvZGUgU2lnbmluZyBDQQIRAIDR3v1Nwwc8nJBR
# gICA3CQwDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG
# 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB
# FTAvBgkqhkiG9w0BCQQxIgQgSgeAm50hbpOmziEB6+bDZ2OVAP4jXC3puvaEec3n
# XVEwDQYJKoZIhvcNAQEBBQAEggEAcNz9qgOkgRXWBgx030bj6nkoaKRchzYS1ROx
# YklpGEn+cCcAdY1ZjjoIAbxRMwC6hEDy/XMNdVY4nkKx6nBUQ+uLMcsxT++zeSEE
# SZWprk0zlEIxBPs3Vy5SIUq8NLHd4/AQMyvidTnBBjvJ4rVYBVcyoOIYrCmLyNjt
# dtY5Jn7jP+cdU/6SZGsH4sUMFZMXUvifY66pIcvHzKOs+endWEUU0xmgBtk28h7A
# QLIzsqBKndeUd8u6YTqa4TfExCQTxQmawGlsrq4jidNVkeUapGrVhHYm3yGP5diI
# K9hiLM3jJpifIWUsqGZevutLCzGBY3VIsAiILguRrAA4KWckBqGCCGswgghnBgor
# BgEEAYI3AwMBMYIIVzCCCFMGCSqGSIb3DQEHAqCCCEQwgghAAgEDMQ8wDQYJYIZI
# AWUDBAIBBQAwggEPBgsqhkiG9w0BCRABBKCB/wSB/DCB+QIBAQYKKwYBBAGyMQIB
# ATAxMA0GCWCGSAFlAwQCAQUABCB/lHbAxFBAU86HJstlvSjZbPFFIN0uJO9uewEO
# +yPvpwIVALDClgPY/9w0lm0fJ0Bap8ORKew8GA8yMDE4MDMxNjA4MzEwNFqggYyk
# gYkwgYYxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx
# EDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSww
# KgYDVQQDEyNDT01PRE8gU0hBLTI1NiBUaW1lIFN0YW1waW5nIFNpZ25lcqCCBKAw
# ggScMIIDhKADAgECAhBOsIePzCQ1NrLYyfe/OVV3MA0GCSqGSIb3DQEBCwUAMIGV
# MQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBD
# aXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0
# dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJzdC1P
# YmplY3QwHhcNMTUxMjMxMDAwMDAwWhcNMTkwNzA5MTg0MDM2WjCBhjELMAkGA1UE
# BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2Fs
# Zm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxLDAqBgNVBAMTI0NPTU9E
# TyBTSEEtMjU2IFRpbWUgU3RhbXBpbmcgU2lnbmVyMIIBIjANBgkqhkiG9w0BAQEF
# AAOCAQ8AMIIBCgKCAQEAzrx0t3CAT17zP5iqLsvUEgEjNWkLIrzm/QlsKOQTEqy7
# ui3l1d0i7nO2LPjSpHHnSSV4qyW3kBCgm4t3Jt1A6kGj/YjNcqaJO1BXHHolJCIC
# UUA1Z4oxaQ3lOXNJOZuVAYVS8isUiZpOBKS8QK45pt1AAuA6df49fVWUW/FOJHzI
# uFgZysDavlgTmuYc59HBO/Bdj0kIIZ7Q877W1GZPXHI2e8OC05gIlK+rRE8YxxTa
# FrEeMg4SOMC1PHbsdVAAIAQRGe3G/99O/giBJzFPcXRuAwxwJ4FVappDkqR/2/0/
# xRceQbvO6Kd/jJX5/X/4YYiJAD7/CwHb/dW1pOSREQIDAQABo4H0MIHxMB8GA1Ud
# IwQYMBaAFNrtZHQUnBQ8q92Zqb1bKE2LPMnYMB0GA1UdDgQWBBR9v5HXp2xaR2ZE
# e5DUjpByQY8XwjAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADAWBgNVHSUB
# Af8EDDAKBggrBgEFBQcDCDBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3JsLnVz
# ZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1PYmplY3QuY3JsMDUGCCsGAQUFBwEB
# BCkwJzAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkq
# hkiG9w0BAQsFAAOCAQEAULD131+tM9zDU1hYvMITdXsgHVTKuj9QP7qK9GsJY8Bb
# XYvWdRpzvYv/R/EV3FEWIxky5m6STdHGLloeiEIUyXLl1whQimr1ZEBWriTjYZcV
# QvAsSK6D5jU8i1vCj66OzDRSNOD7/sr9sSRo0aQRIxAG/bLCJCfH1+lKHI8/Ps/t
# 63V5bI5f9yG2UOYloc1mlBJsv9uzrofYaANyIALCftqU83IHPFfoVSTnBaAdxIEB
# gksfPw+dM5vwT8yd1oWBz8vn/Urpkrj3DXJzLel3+W+PKHo+Hr0IhtyNHhFf91u7
# h3bGnkxUYdBn25OE2jGHA5Lnn+Ppz1pWyGjgUkmUXDGCAnEwggJtAgEBMIGqMIGV
# MQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBD
# aXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0
# dHA6Ly93d3cudXNlcnRydXN0LmNvbTEdMBsGA1UEAxMUVVROLVVTRVJGaXJzdC1P
# YmplY3QCEE6wh4/MJDU2stjJ9785VXcwDQYJYIZIAWUDBAIBBQCggZgwGgYJKoZI
# hvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0xODAzMTYwODMx
# MDRaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYEFDZSfU+iamj560WW8dmauywOp236
# MC8GCSqGSIb3DQEJBDEiBCAe0F5Enn6kkDZXwjr4lZ56GL6xc76s0cqEi5dbUogi
# aTANBgkqhkiG9w0BAQEFAASCAQAU7y0m4JGhZs5SMZxTNWiDxM0r2eX4y6fscDwu
# 3BUWEjuP5TOapUk032eEuNLHE79Jqb2QEqY/CbtKOkeBXjkmEG250RKeHiMauAeY
# xpUI9UG0RqFwTuklzMW0FeRV4pc3ehTtZw5GEqREKPG1HOXPYfymY84zO6297yZK
# BMBXmBdQYHgro4fbHrdEQ+8Rgz8JR0VS+qV84uVT3LTKgieTJVq/rXhHV2/UKAKI
# 85mWXQWGnB3ykpvND2LDpRs/NVZrJ0m7/EdniW1WEXNlnryFgdVZJ0+0fXE1bjpD
# hj4EfE7zTuynhZ17pzKgOeGbMIzO506xHs1oRyehxBIVMAgO
# SIG # End signature block