Blog

AVD Access to SMB shares Part 2: How To configure access

When designing Azure Virtual Desktop environments, authentication is often discussed at the point where the user signs in. But that is only part of the story. Once the user is inside their AVD session, applications still need to access backend services such as file shares, databases, and line-of-business systems. One common example is an application running on an AVD session host that needs to access an Azure Files share using Kerberos authentication.

In this scenario, the session host, the user identity, Active Directory, Microsoft Entra ID, DNS, networking, SMB, and file share permissions all need to work together. If one part is missing or misconfigured, the result is usually slow logons, access denied errors, failed profile loads, or applications that simply cannot reach the data they depend on.

This is a practical guide to getting that access configured.

Session host must be domain joined and hybrid joined

For AD DS authentication to Azure Files, the cleanest configuration is:

AVD session host = AD DS domain joined + Microsoft Entra hybrid joined

The guidance says AD DS-joined machines can mount Azure file shares using existing AD DS credentials, and Microsoft recommends domain-joining the client machines or VMs so users don’t need to provide explicit credentials each time.

On the session host, validate with:

dsregcmd /status

You want to see something like:

DomainJoined : YES

AzureAdJoined : YES

Also check the AD domain:

echo %USERDOMAIN%

nltest /dsgetdc:yourdomain.local

If the host is only Microsoft Entra joined and not AD DS domain joined, then the design changes. You would be looking at Microsoft Entra Kerberos for Azure Files, not classic AD DS authentication. Azure Files supports AD DS, Microsoft Entra Domain Services, and Microsoft Entra Kerberos, but only one identity source can be enabled on a storage account for SMB identity authentication.

Session host must have line of sight to domain controllers

The AVD session host needs network connectivity to AD DS domain controllers to request Kerberos tickets.

This includes DNS resolution and Kerberos connectivity. Azure Files AD DS authentication expects clients using AD DS to have uninterrupted connectivity to the domain controller, unless explicit credentials are being supplied.

At a practical level, allow traffic from the AVD subnet to your domain controllers for the following:

The exact firewall rules depend on your AD design, but the key point is this:

AVD session host must be able to locate and talk to a writable domain controller.

Useful checks:

nltest /dsgetdc:contoso.local

nltest /sc_verify:contoso.local

echo %LOGONSERVER%

Session host DNS must be correct

This is massive. In Kerberos, realm names are very case sensitive.

The session host should use DNS servers that can resolve:

  • AD DS domain records
  • DC SRV records
  • "storageaccount".file.core.windows.net

For AD DS, the session host should normally point to your AD-integrated DNS servers, often your domain controllers or DNS forwarders.

Check domain controller discovery:

nslookup -type=SRV kerberos.tcp.contoso.local

nslookup -type=SRV ldap.tcp.dc._msdcs.contoso.local

Check the Azure Files endpoint:

nslookup "storageaccount".file.core.windows.net

If you use a private endpoint for Azure Files, DNS should resolve the storage account file endpoint to the private IP via the relevant Private DNS zone, typically involving:

privatelink.file.core.windows.net

If DNS resolves to the wrong endpoint, the Kerberos ticket may be correct but the SMB connection can still fail in a very unhelpful, “Windows being Windows” sort of way.

Session host must reach Azure Files over SMB port 445

The AVD session host must be able to connect to the Azure Files endpoint over TCP 445.

Microsoft’s Azure Files SMB mounting guidance states that SMB requires TCP port 445 to be open, and connections fail if TCP 445 is blocked.

Test from the session host:

Test-NetConnection "storageaccount".file.core.windows.net -Port 445

You want:

TcpTestSucceeded : True

If you use private endpoints, test the private endpoint path. If you use public endpoints, make sure NSGs, Azure Firewall, NVA routing, proxy inspection, or firewall rules are not blocking SMB.

Session host must be using the correct UNC path

Use the real Azure Files SMB path:

\\"storageaccount".file.core.windows.net\sharename

Do not casually swap this for a DNS alias unless SPNs and name mapping are deliberately designed for it.

Kerberos tickets are issued for the service name the client is trying to access. For Azure Files AD DS authentication, the expected CIFS service principal name is usually:

cifs/"storageaccount".file.core.windows.net

Microsoft’s AD DS enablement guidance describes registering the storage account with AD DS using a computer account or service logon account, similar to an on-prem Windows file server.

From the session host, test ticket retrieval:

klist get cifs/"storageaccount".file.core.windows.net

Then check tickets:

klist

You should see a ticket for something like:

cifs/"storageaccount".file.core.windows.net

The session host must not be falling back to storage account key auth

If the file share has previously been mapped using a storage account key, Windows may have stored credentials.

Check:

cmdkey /list

Remove old stored credentials for the storage account if present:

cmdkey /delete:"storageaccount".file.core.windows.net

Also disconnect old mappings:

net use

net use \\"storageaccount".file.core.windows.net\sharename /delete

Then reconnect using identity-based auth:

net use \\"storageaccount".file.core.windows.net\sharename

The goal is:

Use Kerberos as the signed-in user. Not the storage account key. Not cached alternate credentials.

Kerberos encryption must be compatible

Azure Files AD DS authentication recommends Kerberos with AES-256 encryption. Microsoft notes that Kerberos authentication is available with AD using AES-256, and their troubleshooting guidance shows verifying that the ticket for cifs/<storage-account-name>.file.core.windows.net uses AES-256.

From the session host:

klist purge

klist get cifs/"storageaccount".file.core.windows.net

klist

Look for:

KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96

If you see RC4 or cannot get a ticket, check the AD object representing the storage account and its supported encryption settings.

Time sync must be healthy

Kerberos depends on time. If the AVD session host, domain controllers, and identity path are out of sync, Kerberos fails.

Check time:

w32tm /query /status

w32tm /query /source

Useful fix/test commands:

w32tm /resync

For domain-joined session hosts, time should normally follow the domain hierarchy. For anyone who has been deploying AVD for a while, you'll know configuring time on session hosts is always something that comes up.

AVD SSO configuration may be required for the logon experience

This is slightly separate from Azure Files access, but important.

For AVD session hosts that are Microsoft Entra joined or Microsoft Entra hybrid joined, Microsoft recommends enabling SSO using Microsoft Entra authentication.

For hybrid joined session hosts, Microsoft also says a Kerberos Server object is required to complete authentication to a domain controller when using this SSO model.

So for a smooth AVD sign-in experience, configure:

  • Host pool Microsoft Entra SSO enabled
  • RDP property: enablerdsaadauth = 1
  • Kerberos Server object created if AD DS is part of the environment
  • Conditional Access reviewed

This helps the AVD session sign-in side. The Azure Files access still depends on the Kerberos ticket to the Azure Files CIFS SPN.

The app must run under the right identity

The session host can be perfectly configured, but the app can still fail if it runs under the wrong context.

If the app runs as the user

This is the normal and preferred flow:

  1. User logs into AVD
  2. App runs as user
  3. App accesses \\"storageaccount".file.core.windows.net\share
  4. Kerberos ticket is requested for the user
  5. Azure Files checks user/group permissions
  6. Good (yes, I actually wrote good!)

If the app runs as LocalSystem

Then network access happens as the session host computer account:

CONTOSO\AVD-SH-01$

That often causes access denied unless the computer account has permissions.

If the app runs as a service account

Then the service account needs access:

CONTOSO\AppServiceAccount

So check what identity the app actually uses.

From the app process context, or a test command prompt running as the same identity:

whoami

klist

dir \\\sharename

Do not use IP address access

Do not access Azure Files like this:

\\10.10.10.5\share

Kerberos needs the service name. Use:

\\"storageaccount".file.core.windows.net\share

Otherwise Windows may not request the correct CIFS Kerberos ticket.

Session host validation script

Run this from the AVD session host, ideally inside the affected user session:

$StorageAccount = "storageaccount"

$Domain = "contoso.local"

$Share = "sharename"

$FileEndpoint = "$"storageaccount".file.core.windows.net"

$CifsSpn = "cifs/$FileEndpoint"

Write-Host "=== Device Join State ==="

dsregcmd /status | findstr /i "DomainJoined AzureAdJoined TenantName"

Write-Host "`n=== Domain Controller Discovery ==="

nltest /dsgetdc:$Domain

Write-Host "`n=== Secure Channel ==="

nltest /sc_verify:$Domain

Write-Host "`n=== DNS Resolution ==="

Resolve-DnsName $FileEndpoint

Write-Host "`n=== SMB Port 445 Test ==="

Test-NetConnection $FileEndpoint -Port 445

Write-Host "`n=== Current User ==="

whoami

whoami /groups

Write-Host "`n=== Kerberos Ticket Test ==="

klist purge

klist get $CifsSpn

klist

Write-Host "`n=== Share Access Test ==="

dir "\\$FileEndpoint\$Share"

Replace:

storageaccount

contoso.local

sharename

with your real values.

Minimum session host checklist

…and finally

The big gotcha is that hybrid joined alone is not the magic bit. For AD DS-authenticated Azure Files, the session host must have proper AD DS Kerberos line of sight, proper DNS, and working SMB connectivity.

Leave a Reply

Your email address will not be published. Required fields are marked *

This field is mandatory

This field is mandatory

This field is mandatory

There was an error submitting your message. Please try again.

Security Check

Invalid Captcha code. Try again.

©Copyright. All rights reserved.

Information icon

We need your consent to load the translations

We use a third-party service to translate the website content that may collect data about your activity. Please review the details in the privacy policy and accept the service to view the translations.