Public/New-UnityCifsServer.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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Function New-UnityCIFSServer {

  <#
      .SYNOPSIS
      Create an SMB/CIFS server.
      .DESCRIPTION
      Create an SMB/CIFS server.
      You need to have an active session with the array.
      .NOTES
      Written by Erwan Quelin under MIT licence - https://github.com/equelin/Unity-Powershell/blob/master/LICENSE
      .LINK
      https://github.com/equelin/Unity-Powershell
      .PARAMETER Session
      Specify an UnitySession Object.
      .PARAMETER nasServer
      ID of the NAS server to which the SMB server belongs.
      .PARAMETER netbiosName
      Computer name of the SMB server in Windows network.
      .PARAMETER name
      User friendly, descriptive name of SMB server.
      .PARAMETER description
      Description of the SMB server.
      .PARAMETER domain
      Domain name where SMB server is registered in Active Directory, if applicable.
      .PARAMETER organizationalUnit
      LDAP organizational unit of SMB server in Active Directory, if applicable.
      .PARAMETER domainUsername
      Active Directory domain user name.
      .PARAMETER domainPassword
      Active Directory domain password.
      .PARAMETER reuseComputerAccount
      Reuse existing SMB server account in the Active Directory.
      .PARAMETER workgroup
      Standalone SMB server workgroup.
      .PARAMETER localAdminPassword
      Standalone SMB server administrator password.
      .PARAMETER interfaces
      List of file IP interfaces that service CIFS protocol of SMB server.
      .PARAMETER Confirm
      If the value is $true, indicates that the cmdlet asks for confirmation before running. If the value is $false, the cmdlet runs without asking for user confirmation.
      .PARAMETER WhatIf
      Indicate that the cmdlet is run only to display the changes that would be made and actually no objects are modified.
      .EXAMPLE
      New-UnityCIFSServer -Name CIFS01 -nasServer 'nas_6' -domain 'example.com' -domainUsername 'administrator' -domainPassword 'Password#123' -interfaces 'if_1'

      Create CIFS Server named 'CIFS01'
  #>


  [CmdletBinding(SupportsShouldProcess = $True,ConfirmImpact = 'High',DefaultParameterSetName="AD")]
  Param (
    [Parameter(Mandatory = $false,HelpMessage = 'EMC Unity Session')]
    $session = ($global:DefaultUnitySession | where-object {$_.IsConnected -eq $true}),
    [Parameter(Mandatory = $false,Position = 1,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,HelpMessage = 'User friendly, descriptive name of SMB server')]
    [String[]]$Name,
    [Parameter(Mandatory = $true,HelpMessage = 'ID of the NAS server to which the SMB server belongs')]
    [String]$nasServer,
    [Parameter(Mandatory = $false,HelpMessage = 'Computer name of the SMB server in Windows network')]
    [String]$netbiosName,
    [Parameter(Mandatory = $false,HelpMessage = 'Description of the SMB server')]
    [String]$Description,
    [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'Domain name where SMB server is registered in Active Directory, if applicable.')]
    [String]$domain,
    [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'LDAP organizational unit of SMB server in Active Directory, if applicable')]
    [String]$organizationalUnit,
    [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'Active Directory domain user name')]
    [String]$domainUsername,
    [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'Active Directory domain password')]
    [String]$domainPassword,
    [Parameter(Mandatory = $false,ParameterSetName="AD",HelpMessage = 'Reuse existing SMB server account in the Active Directory')]
    [Bool]$reuseComputerAccount,
    [Parameter(Mandatory = $false,ParameterSetName="Workgroup",HelpMessage = 'Standalone SMB server workgroup name')]
    [String]$workgroup,
    [Parameter(Mandatory = $false,ParameterSetName="Workgroup",HelpMessage = 'Is Snapshot Harvest Enabled')]
    [String]$localAdminPassword,
    [Parameter(Mandatory = $false,HelpMessage = 'List of file IP interfaces that service CIFS protocol of SMB server')]
    [String[]]$interfaces
  )

  Begin {
    Write-Debug -Message "[$($MyInvocation.MyCommand)] Executing function"

    ## Variables
    $URI = '/api/types/cifsServer/instances'
    $Type = 'Server CIFS'
    $StatusCode = 201
  }

  Process {
    Foreach ($sess in $session) {

      Write-Debug -Message "Processing Session: $($sess.Server) with SessionId: $($sess.SessionId)"

      Foreach ($n in $Name) {

        #### REQUEST BODY

        # Creation of the body hash
        $body = @{}

        # nasServer argument
        $body["nasServer"] = @{}
        $nasServerArg = @{}
        $nasServerArg["id"] = "$($nasServer)"
        $body["nasServer"] = $nasServerArg

        # netbiosName argument
        If ($PSBoundParameters.ContainsKey('netbiosName')) {
              $body["netbiosName"] = "$($netbiosName)"
        }

        # Name argument
        If ($PSBoundParameters.ContainsKey('Name')) {
              $body["name"] = "$($name)"
        }

        # Description argument
        If ($PSBoundParameters.ContainsKey('description')) {
              $body["description"] = "$($description)"
        }

        # domain argument
        If ($PSBoundParameters.ContainsKey('domain')) {
              $body["domain"] = "$($domain)"
        }

        # organizationalUnit argument
        If ($PSBoundParameters.ContainsKey('organizationalUnit')) {
              $body["organizationalUnit"] = "$($organizationalUnit)"
        }

        # domainUsername argument
        If ($PSBoundParameters.ContainsKey('domainUsername')) {
              $body["domainUsername"] = "$($domainUsername)"
        }

        # domainPassword argument
        If ($PSBoundParameters.ContainsKey('domainPassword')) {
              $body["domainPassword"] = "$($domainPassword)"
        }

        # reuseComputerAccount argument
        If ($PSBoundParameters.ContainsKey('reuseComputerAccount')) {
              $body["reuseComputerAccount"] = $reuseComputerAccount
        }

        # workgroup argument
        If ($PSBoundParameters.ContainsKey('workgroup')) {
              $body["workgroup"] = "$($workgroup)"
        }

        # localAdminPassword argument
        If ($PSBoundParameters.ContainsKey('localAdminPassword')) {
              $body["localAdminPassword"] = "$($localAdminPassword)"
        }

        #interfaces argument
        If ($PSBoundParameters.ContainsKey('interfaces')) {
          $body['interfaces'] = @()
          Foreach ($int in $interfaces) {
            $ÎntArgument = @{}
            $ÎntArgument['id'] = "$($int)"
            $body["interfaces"] += $ÎntArgument
          }
        }

        ####### END BODY - Do not edit beyond this line

        #Show $body in verbose message
        $Json = $body | ConvertTo-Json -Depth 10
        Write-Verbose $Json  

        If ($Sess.TestConnection()) {

          ##Building the URL
          $URL = 'https://'+$sess.Server+$URI
          Write-Verbose "URL: $URL"

          #Sending the request
          If ($pscmdlet.ShouldProcess($Sess.Name,"Create $Type $n")) {
            $request = Send-UnityRequest -uri $URL -Session $Sess -Method 'POST' -Body $Body
          }

          Write-Verbose "Request status code: $($request.StatusCode)"

          If ($request.StatusCode -eq $StatusCode) {

            #Formating the result. Converting it from JSON to a Powershell object
            $results = ($request.content | ConvertFrom-Json).content

            Write-Verbose "$Type with the ID $($results.id) has been created"

            Get-UnityCifsServer -Session $Sess -ID $results.id
          } # End If ($request.StatusCode -eq $StatusCode)
        } # End If ($Sess.TestConnection())
      } # End Foreach
    } # End Foreach ($sess in $session)
  } # End Process
} # End Function