DSCResources/ArcGIS_NotebookServerWorkspaceSetup/ArcGIS_NotebookServerWorkspaceSetup.psm1
$modulePath = Join-Path -Path (Split-Path -Path (Split-Path -Path $PSScriptRoot -Parent) -Parent) -ChildPath 'Modules' # Import the ArcGIS Common Modules Import-Module -Name (Join-Path -Path $modulePath ` -ChildPath (Join-Path -Path 'ArcGIS.Common' ` -ChildPath 'ArcGIS.Common.psm1')) function Get-TargetResource { [CmdletBinding()] [OutputType([System.Collections.Hashtable])] param ( [parameter(Mandatory = $true)] [System.Management.Automation.PSCredential] $FileShareCredential, [parameter(Mandatory = $true)] [System.String] $FileShareEndpoint, [parameter(Mandatory = $true)] [System.String] $FileShareName, [parameter(Mandatory = $true)] [System.String] $ArcGISWorkspaceLocation, [System.Boolean] $UseAzureFiles, [System.String[]] $UserAccountsWithPermissions, [System.Boolean] $IsSingleTier, [System.Boolean] $Join ) $null } function Set-TargetResource { [CmdletBinding()] [OutputType([System.Collections.Hashtable])] param ( [parameter(Mandatory = $true)] [System.Management.Automation.PSCredential] $FileShareCredential, [parameter(Mandatory = $true)] [System.String] $FileShareEndpoint, [parameter(Mandatory = $true)] [System.String] $FileShareName, [parameter(Mandatory = $true)] [System.String] $ArcGISWorkspaceLocation, [System.Boolean] $UseAzureFiles, [System.String[]] $UserAccountsWithPermissions, [System.Boolean] $IsSingleTier, [System.Boolean] $Join ) $fsusername = "$($env:COMPUTERNAME)\$($FileShareCredential.GetNetworkCredential().UserName)" if($UseAzureFiles -ieq 'True') { $AzureFileStrAccountName = $FileShareEndpoint.Substring(0, $FileShareEndpoint.IndexOf('.')) $fsusername = "Azure\$AzureFileStrAccountName" } $FSCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ( $fsusername, $FileShareCredential.Password ) $FSSharePath = "\\$($FileShareEndpoint)\$FileShareName" if($UseAzureFiles){ $AvailableDriveLetter = Get-AvailableDriveLetter $connectTestResult = Test-NetConnection -ComputerName "$FileShareEndpoint" -Port 445 #TODO Write-Host "connectTestResult - $($connectTestResult.TcpTestSucceeded)" if ($connectTestResult.TcpTestSucceeded) { New-PSDrive -Name $AvailableDriveLetter -PSProvider FileSystem -Root $FSSharePath -Credential $FSCredential -Persist } else { Write-Error -Message "Unable to reach the Azure storage account via port 445. Check to make sure your organization or ISP is not blocking port 445, or use Azure P2S VPN, Azure S2S VPN, or Express Route to tunnel SMB traffic over a different port." } $newPath = $ArcGISWorkspaceLocation.Replace($FSSharePath, "$($AvailableDriveLetter):") New-Item -Path $newPath -ItemType Directory -Force Remove-PSDrive -Name $AvailableDriveLetter } if(Get-SmbGlobalMapping -LocalPath G: -RemotePath $ArcGISWorkspaceLocation -ErrorAction Ignore){ Write-Verbose "SMB mapping already exists" }else{ if($IsSingleTier -and -not($Join) -and -not($UseAzureFiles)){ New-SmbGlobalMapping -RemotePath $ArcGISWorkspaceLocation -Credential $FSCredential ` -LocalPath G: -Persistent $true -FullAccess $UserAccountsWithPermissions -Verbose }else{ New-SmbGlobalMapping -RemotePath $ArcGISWorkspaceLocation -Credential $FSCredential ` -LocalPath G: -Persistent $true -Verbose } } if(-not($Join) -and -not($UseAzureFiles) -and $IsSingleTier){ $ServiceName = 'ArcGIS Notebook Server' $RegKey = Get-EsriRegistryKeyForService -ServiceName $ServiceName $InstallDir = (Get-ItemProperty -Path $RegKey -ErrorAction Ignore).InstallDir $UserPassFilePath = "$($InstallDir)\NBWorkspaceUser.txt" $FSCredential.GetNetworkCredential().Password | Out-File $UserPassFilePath $acc = $UserAccountsWithPermissions -Join ',' $Trigger = New-ScheduledTaskTrigger -AtStartup $User = "NT AUTHORITY\SYSTEM" # Specify the account to run the script $Arguments = @" -NoProfile -ExecutionPolicy Bypass -Command "& { New-NotebookWorkspaceSMBGlobalMapping -RemotePath $($ArcGISWorkspaceLocation) -DriveLetter G -AccountsWithFullAccess '$acc' -Username $($Credential.UserName) -WorkspaceUserFilePath '$UserPassFilePath' }" "@ $Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument $Arguments # Specify what program to run and with its parameters Register-ScheduledTask -TaskName "NBWorkspaceVMStartupTask" -Trigger $Trigger -User $User -Action $Action -RunLevel Highest -Force -Verbose # Specify the name of the task Write-Host "Created VM Startup Task" } } function Test-TargetResource { [CmdletBinding()] [OutputType([System.Boolean])] param ( [parameter(Mandatory = $true)] [System.Management.Automation.PSCredential] $FileShareCredential, [parameter(Mandatory = $true)] [System.String] $FileShareEndpoint, [parameter(Mandatory = $true)] [System.String] $FileShareName, [parameter(Mandatory = $true)] [System.String] $ArcGISWorkspaceLocation, [System.Boolean] $UseAzureFiles, [System.String[]] $UserAccountsWithPermissions, [System.Boolean] $IsSingleTier, [System.Boolean] $Join ) if(Get-SmbGlobalMapping -LocalPath G: -RemotePath $ArcGISWorkspaceLocation -ErrorAction Ignore){ Write-Verbose "SMB mapping for network location $($ArcGISWorkspaceLocation) already exists" return $True }else{ Write-Verbose "SMB mapping for network location $($ArcGISWorkspaceLocation) doesn't exists" return $False } } Export-ModuleMember -Function *-TargetResource |