@@ -883,13 +883,13 @@ function Request-AzPowerShellModule {
883883
884884 $storageModule = Get-Module - Name Az.Storage - ListAvailable | `
885885 Where-Object {
886- $_.Version -ge [Version ]::new(2 , 0 , 0 )
886+ $_.Version -ge [Version ]::new(4 , 3 , 0 )
887887 }
888888
889889 # Do should process if modules must be installed
890890 if ($null -eq $azModule -or $null -eq $storageModule ) {
891891 $caption = " Install Azure PowerShell modules"
892- $verboseConfirmMessage = " This module requires Azure PowerShell (`" Az`" module) 2.8.0+ and Az.Storage 2.0 .0+. This can be installed now if you are running as an administrator."
892+ $verboseConfirmMessage = " This module requires Azure PowerShell (`" Az`" module) 2.8.0+ and Az.Storage 4.3 .0+. This can be installed now if you are running as an administrator."
893893
894894 if ($PSCmdlet.ShouldProcess ($verboseConfirmMessage , $verboseConfirmMessage , $caption )) {
895895 if (! (Get-IsElevatedSession )) {
@@ -926,7 +926,7 @@ function Request-AzPowerShellModule {
926926 - Repository PSGallery `
927927 - AllowClobber `
928928 - Force `
929- - MinimumVersion " 2.0 .0" `
929+ - MinimumVersion " 4.3 .0" `
930930 - SkipPublisherCheck `
931931 - ErrorAction Stop
932932 }
@@ -941,7 +941,7 @@ function Request-AzPowerShellModule {
941941
942942 $storageModule = , (Get-Module - Name Az.Storage - ListAvailable | `
943943 Where-Object {
944- $_.Version -ge [Version ]::new(2 , 0 , 0 )
944+ $_.Version -ge [Version ]::new(4 , 3 , 0 )
945945 } | `
946946 Sort-Object - Property Version - Descending)
947947
@@ -2379,7 +2379,10 @@ function New-ADAccountForStorageAccount {
23792379 [string ]$ObjectType = " ComputerAccount" ,
23802380
23812381 [Parameter (Mandatory = $false , Position = 6 )]
2382- [switch ]$OverwriteExistingADObject
2382+ [switch ]$OverwriteExistingADObject ,
2383+
2384+ [Parameter (Mandatory = $false , Position = 7 )]
2385+ [string ]$SamAccountName
23832386 )
23842387
23852388 Assert-IsWindows
@@ -2513,6 +2516,12 @@ function New-ADAccountForStorageAccount {
25132516 Write-Verbose - Message " Overwriting an existing AD $ObjectType object $ADObjectName with a Service Principal Name of $spnValue in domain $Domain ."
25142517 }
25152518
2519+ if ([System.String ]::IsNullOrEmpty($SamAccountName )) {
2520+ $SamAccountName = $ADObjectName
2521+ }
2522+
2523+ Write-Verbose - Message " AD object name is $ADObjectName , SamAccountName is $SamAccountName ."
2524+
25162525 # Create the identity in Active Directory.
25172526 try
25182527 {
@@ -2528,7 +2537,7 @@ function New-ADAccountForStorageAccount {
25282537 Set-ADUser - Instance $userSpnMatch - ErrorAction Stop
25292538 } else {
25302539 New-ADUser `
2531- - SamAccountName $ADObjectName `
2540+ - SamAccountName $SamAccountName `
25322541 - Path $path `
25332542 - Name $ADObjectName `
25342543 - AccountPassword $fileServiceAccountPwdSecureString `
@@ -2555,7 +2564,7 @@ function New-ADAccountForStorageAccount {
25552564 Set-ADComputer - Instance $computerSpnMatch - ErrorAction Stop
25562565 } else {
25572566 New-ADComputer `
2558- - SAMAccountName $ADObjectName `
2567+ - SAMAccountName $SamAccountName `
25592568 - Path $path `
25602569 - Name $ADObjectName `
25612570 - AccountPassword $fileServiceAccountPwdSecureString `
@@ -3736,7 +3745,9 @@ function Set-StorageAccountDomainProperties {
37363745 ForestName=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.ForestName ) `
37373746 DomainGuid=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.DomainGuid ) `
37383747 DomainSid=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.DomainSid ) `
3739- AzureStorageSid=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.AzureStorageSid ) " `
3748+ AzureStorageSid=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.AzureStorageSid ) `
3749+ SamAccountName=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.SamAccountName ) `
3750+ AccountType=$ ( $storageAccount.AzureFilesIdentityBasedAuth.ActiveDirectoryProperties.AccountType ) " `
37403751 - ErrorAction Stop
37413752 }
37423753
@@ -3758,24 +3769,43 @@ function Set-StorageAccountDomainProperties {
37583769 - Domain $Domain `
37593770 - ErrorAction Stop
37603771 $azureStorageSid = $azureStorageIdentity.SID.Value
3761-
3772+ $samAccountName = $azureStorageIdentity .SamAccountName.TrimEnd ( " $ " )
37623773 $domainGuid = $domainInformation.ObjectGUID.ToString ()
37633774 $domainName = $domainInformation.DnsRoot
37643775 $domainSid = $domainInformation.DomainSID.Value
37653776 $forestName = $domainInformation.Forest
37663777 $netBiosDomainName = $domainInformation.DnsRoot
3778+ $accountType = " "
3779+
3780+ switch ($azureStorageIdentity.ObjectClass ) {
3781+ " computer" {
3782+ $accountType = " Computer"
3783+ }
3784+ " user" {
3785+ $accountType = " User"
3786+ }
3787+ Default {
3788+ Write-Error `
3789+ - Message (" AD object $ADObjectName is of unsupported object class " + $azureStorageIdentity.ObjectClass + " ." ) `
3790+ - ErrorAction Stop
3791+ }
3792+ }
37673793
37683794 Write-Verbose " Setting AD properties on $StorageAccountName in $ResourceGroupName : `
37693795 EnableActiveDirectoryDomainServicesForFile=$true , ActiveDirectoryDomainName=$domainName , `
37703796 ActiveDirectoryNetBiosDomainName=$netBiosDomainName , ActiveDirectoryForestName=$ ( $domainInformation.Forest ) `
37713797 ActiveDirectoryDomainGuid=$domainGuid , ActiveDirectoryDomainSid=$domainSid , `
3772- ActiveDirectoryAzureStorageSid=$azureStorageSid "
3798+ ActiveDirectoryAzureStorageSid=$azureStorageSid , `
3799+ ActiveDirectorySamAccountName=$samAccountName , `
3800+ ActiveDirectoryAccountType=$accountType "
37733801
37743802 Set-AzStorageAccount - ResourceGroupName $ResourceGroupName - AccountName $StorageAccountName `
37753803 - EnableActiveDirectoryDomainServicesForFile $true - ActiveDirectoryDomainName $domainName `
37763804 - ActiveDirectoryNetBiosDomainName $netBiosDomainName - ActiveDirectoryForestName $forestName `
37773805 - ActiveDirectoryDomainGuid $domainGuid - ActiveDirectoryDomainSid $domainSid `
3778- - ActiveDirectoryAzureStorageSid $azureStorageSid
3806+ - ActiveDirectoryAzureStorageSid $azureStorageSid `
3807+ - ActiveDirectorySamAccountName $samAccountName `
3808+ - ActiveDirectoryAccountType $accountType
37793809 }
37803810
37813811 Write-Verbose " Set-StorageAccountDomainProperties: Complete"
@@ -3881,7 +3911,7 @@ function Test-AzStorageAccountADObjectPasswordIsKerbKey {
38813911 $domainDns = $activeDirectoryProperties.DomainName
38823912 $domain = Get-ADDomain - Server $domainDns
38833913
3884- $userName = $domain.NetBIOSName + " \" + $adObj.Name
3914+ $userName = $domain.NetBIOSName + " \" + $adObj.SamAccountName
38853915
38863916 $oneKeyMatches = $false
38873917 $keyMatches = [KerbKeyMatch []]@ ()
@@ -4259,18 +4289,21 @@ function Update-AzStorageAccountAuthForAES256 {
42594289 $adObject = Get-AzStorageAccountADObject - ResourceGroupName $ResourceGroupName `
42604290 - StorageAccountName $StorageAccountName - ErrorAction Stop
42614291
4292+ $adObjectName = $adObject.Name
4293+
42624294 $activeDirectoryProperties = Get-AzStorageAccountActiveDirectoryProperties `
42634295 - ResourceGroupName $ResourceGroupName - StorageAccountName $StorageAccountName - ErrorAction Stop
42644296 $domain = $activeDirectoryProperties.DomainName
42654297
4266- if (( $adObject.ObjectClass -ine " computer" ) -or ( $adObject .SamAccountName.TrimEnd ( " $ " ) -ine $StorageAccountName ) ) {
4298+ if ($adObject.ObjectClass -ine " computer" ) {
42674299 $message = " Removing object '$ ( $adObject.DistinguishedName ) ' of type '$adObject .ObjectClass' from domain '$domain '." `
42684300 + " AES256 is only supported for computer objects."
42694301 Write-Verbose - Message $message
42704302
42714303 Remove-ADObject - Identity $adObject.DistinguishedName - Server $domain - Confirm:$false - ErrorAction Stop
42724304
42734305 $organizationalUnitDistinguishedName = $adObject.DistinguishedName.Substring ($adObject.DistinguishedName.IndexOf (' ,' ) + 1 )
4306+ $samAccountName = $adObject.SamAccountName.TrimEnd (" $" )
42744307
42754308 $message = " Join storage account '$StorageAccountName ' to domain '$domain '" `
42764309 + " as a computer object under '$organizationalUnitDistinguishedName '"
@@ -4279,12 +4312,20 @@ function Update-AzStorageAccountAuthForAES256 {
42794312 Join-AzStorageAccount - ResourceGroupName $ResourceGroupName - StorageAccountName $StorageAccountName `
42804313 - Domain $domain - DomainAccountType " ComputerAccount" `
42814314 - OrganizationalUnitDistinguishedName $organizationalUnitDistinguishedName `
4282- - ADObjectNameOverride $StorageAccountName - ErrorAction Stop
4315+ - ADObjectNameOverride $adObjectName - SamAccountName $samAccountName `
4316+ - ErrorAction Stop
42834317
42844318 $adObject = Get-AzStorageAccountADObject - ResourceGroupName $ResourceGroupName `
42854319 - StorageAccountName $StorageAccountName - ErrorAction Stop
4320+ } else {
4321+ Set-StorageAccountDomainProperties `
4322+ - ADObjectName $adObjectName `
4323+ - ResourceGroupName $ResourceGroupName `
4324+ - StorageAccountName $StorageAccountName `
4325+ - Domain $domain `
4326+ - Force
42864327 }
4287-
4328+
42884329 Write-Verbose - Message " Set AD object '$ ( $adObject.DistinguishedName ) ' to use AES256 for Kerberos authentication"
42894330 Set-ADComputer - Identity $adObject.DistinguishedName - Server $domain `
42904331 - KerberosEncryptionType " AES256" - ErrorAction Stop
@@ -4375,7 +4416,10 @@ function Join-AzStorageAccount {
43754416 [switch ]$OverwriteExistingADObject ,
43764417
43774418 [Parameter (Mandatory = $false , Position = 7 )]
4378- [System.Collections.Generic.HashSet [string ]]$EncryptionType = @ (" RC4" , " AES256" )
4419+ [System.Collections.Generic.HashSet [string ]]$EncryptionType = @ (" RC4" , " AES256" ),
4420+
4421+ [Parameter (Mandatory = $false , Position = 8 )]
4422+ [string ]$SamAccountName
43794423 )
43804424
43814425 begin {
@@ -4406,30 +4450,16 @@ function Join-AzStorageAccount {
44064450 $ResourceGroupName = $StorageAccount.ResourceGroupName
44074451 }
44084452
4409- if ($EncryptionType -contains " AES256" ) {
4410- if ($PSBoundParameters.ContainsKey (" ADObjectNameOverride" ) -and ($ADObjectNameOverride -ine $StorageAccountName )) {
4411- $message = " Parameter -ADObjectNameOverride '$ADObjectNameOverride ' is different from storage account" `
4412- + " name '$StorageAccountName '. It cannot be used as the SamAccountName to create an Active Directory object" `
4413- + " for the storage account. Azure Files will be supporting AES256 encryption for Kerberos tickets," `
4414- + " which requires that the SamAccountName match the storage account name."
4415- Write-Error - Message $message - ErrorAction Stop
4416- }
4417- if ($StorageAccountName.Length -gt 15 ) {
4418- $message = " Parameter -StorageAccountName '$StorageAccountName ' has more than 15 characters," `
4419- + " which is not supported to be used as the SamAccountName to create an Active Directory object" `
4420- + " for the storage account. Azure Files will be supporting AES256 encryption for Kerberos tickets," `
4421- + " which requires that the SamAccountName match the storage account name. Please consider using" `
4422- + " a storage account with a shorter name."
4423- Write-Error - Message $message - ErrorAction Stop
4424- }
4453+ if (! $PSBoundParameters.ContainsKey (" ADObjectNameOverride" )) {
4454+ $ADObjectNameOverride = $StorageAccountName
44254455 }
44264456
4427- if (! $PSBoundParameters.ContainsKey (" ADObjectNameOverride " )) {
4457+ if (! $PSBoundParameters.ContainsKey (" SamAccountName " )) {
44284458 if ($StorageAccountName.Length -gt 15 ) {
44294459 $randomSuffix = Get-RandomString - StringLength 5 - AlphanumericOnly
4430- $ADObjectNameOverride = $StorageAccountName.Substring (0 , 10 ) + $randomSuffix
4460+ $SamAccountName = $StorageAccountName.Substring (0 , 10 ) + $randomSuffix
44314461 } else {
4432- $ADObjectNameOverride = $StorageAccountName
4462+ $SamAccountName = $StorageAccountName
44334463 }
44344464 }
44354465
@@ -4455,7 +4485,8 @@ function Join-AzStorageAccount {
44554485 " ADObjectName" = $ADObjectNameOverride ;
44564486 " StorageAccountName" = $StorageAccountName ;
44574487 " ResourceGroupName" = $ResourceGroupName ;
4458- " ObjectType" = $DomainAccountType
4488+ " ObjectType" = $DomainAccountType ;
4489+ " SamAccountName" = $SamAccountName
44594490 }
44604491
44614492 if ($PSBoundParameters.ContainsKey (" Domain" )) {
0 commit comments