After rebooting Windows Server 2012 R2 systems, many administrators report network connections inexplicably switching between Public and Private profiles. This behavior particularly affects:
- iSCSI connections failing authentication
- Internal ping requests being blocked
- Firewall rules not applying correctly
The network location profile directly impacts Windows Firewall behavior and network discovery settings. A misconfigured profile can:
# Example of blocked iSCSI traffic due to wrong profile
Test-NetConnection -ComputerName iscsi-target -Port 3260
# Returns "False" when profile is Public with default firewall rules
The modern UI in Server 2012 R2 lacks profile control options. Use this PowerShell approach instead:
# First, identify network connections and their current profiles
Get-NetConnectionProfile | Select-Object Name, InterfaceAlias, NetworkCategory
# Force a specific connection to Private
$targetAdapter = Get-NetAdapter -Name "InternalBackbone"
Set-NetConnectionProfile -InterfaceIndex $targetAdapter.ifIndex -NetworkCategory Private
# For multiple adapters
Get-NetAdapter | Where-Object { $_.Name -like "Corp*" } | ForEach-Object {
Set-NetConnectionProfile -InterfaceIndex $_.ifIndex -NetworkCategory Private
}
Create a scheduled task triggered at startup to enforce profiles:
$trigger = New-ScheduledTaskTrigger -AtStartup
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NoProfile -Command `"Get-NetAdapter -Name 'Internal*' | Set-NetConnectionProfile -NetworkCategory Private`""
Register-ScheduledTask -TaskName "EnforceNetworkProfiles" `
-Trigger $trigger -Action $action -RunLevel Highest
If profiles still reset, check for:
- Group Policies overriding local settings (
gpresult /h report.html
) - Conflicting network location awareness services
- NIC driver issues (update from manufacturer)
# Diagnostic command to check profile history
Get-WinEvent -LogName "Microsoft-Windows-NetworkProfile/Operational" |
Where-Object { $_.Id -in (10000,10001,10002) } |
Format-Table TimeCreated, Message -AutoSize
For environments with multiple network interfaces, consider implementing this wrapper script that logs profile changes:
function Set-PersistentNetworkProfile {
param(
[string]$AdapterPattern,
[ValidateSet("Public","Private","DomainAuthenticated")]
[string]$Profile
)
$adapters = Get-NetAdapter | Where-Object { $_.Name -like $AdapterPattern }
if (-not $adapters) {
Write-EventLog -LogName "Application" -Source "NetworkConfig" `
-EntryType Warning -EventId 500 -Message "No adapters matched pattern $AdapterPattern"
return
}
$adapters | ForEach-Object {
$current = Get-NetConnectionProfile -InterfaceIndex $_.ifIndex
if ($current.NetworkCategory -ne $Profile) {
Set-NetConnectionProfile -InterfaceIndex $_.ifIndex -NetworkCategory $Profile
Write-EventLog -LogName "Application" -Source "NetworkConfig" `
-EntryType Information -EventId 501 `
-Message "Changed $($_.Name) from $($current.NetworkCategory) to $Profile"
}
}
}
# Usage example:
Set-PersistentNetworkProfile -AdapterPattern "Internal*" -Profile Private
When our Windows Server 2012 R2 reboots, network connections mysteriously switch between public and private profiles. This particularly affects:
- iSCSI connections failing authentication
- Internal ping requests being blocked
- Firewall rules not applying correctly
The network profile type controls:
1. Windows Firewall rulesets
2. Network discovery settings
3. Authentication requirements
4. Service accessibility
Here's the definitive way to lock network profiles using PowerShell:
# Identify network interfaces
$adapters = Get-NetConnectionProfile
# Set specific adapter to Private
Set-NetConnectionProfile -InterfaceIndex 12 -NetworkCategory Private
# Verify the change
Get-NetConnectionProfile -InterfaceIndex 12 | Select Name, NetworkCategory
For environments with multiple NICs:
# Configure all Ethernet adapters as Private
Get-NetAdapter -Physical | Where-Object {$_.MediaType -eq "802.3"} | ForEach-Object {
$profile = Get-NetConnectionProfile -InterfaceIndex $_.ifIndex
if ($profile.NetworkCategory -ne "Private") {
Set-NetConnectionProfile -InterfaceIndex $_.ifIndex -NetworkCategory Private
}
}
For systems where GPO keeps resetting profiles:
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\{GUID}" /v Category /t REG_DWORD /d 1 /f
Note: Replace {GUID} with the actual profile GUID from:
Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles\"
Common issues I've encountered:
- Multiple NICs on same subnet causing profile collisions
- GPO overriding local settings every 90 minutes
- Network location awareness service stuck