Вступление: Зачем это нужно? Или «Опять пропал Z:\\!»
Если вы не знаете, что такое «отвалилась буква диска» и не слышали историй про бухгалтера Люду, которая «ничего не трогала, а оно само», можете смело закрывать эту статью и идти наслаждаться жизнью. Остальным же, прошедшим огонь, медные трубы и обрыв кабеля, посвящается.
Автоматическое подключение сетевых ресурсов при загрузке — это как завести утром машину и обнаружить, что бензин уже залит, а печка включена. Мелочь, а приятно. И пользователи не дергают. Ну, почти не дергают.
Эпоха каменного века: Windows 7 и её любимые «костыли»
Времена, когда «семерка» была вершиной эволюции. И времена, когда сетевое подключение было капризнее кота. Методы были, мягко говоря, душевные.
Метод 1: Старый добрый (и тупой) net use в автозагрузку
Помните bat-файлы? Я помню. Создаем текстовый файлик map_network.bat, пишем туда магию:
@echo off
REM Ждем, пока сетевая карта проснется после зимней спячки
timeout /t 30 /nobreak
REM Основные диски
net use Z: \\srv-fs01\shared /persistent:yes /user:DOMAIN\Username Password123
net use Y: \\srv-fs01\departments /persistent:yes
REM А это для особо важных - с проверкой
net use * /delete /y
if exist \\srv-backup\archives (
net use X: \\srv-backup\archives /persistent:yes
) else (
echo Резервный сервер не доступен, идем пить кофе
net use X: \\srv-fs02\archives /persistent:yes
)
REM Сохраняем результат в лог для будущих поколений
echo Диски подключены %date% %time% >> C:\Logs\network_drive.log
Почему это костыль? Потому что скрипт запускается ДО инициализации сети. Поэтому `timeout 30` — это не прихоть, это попытка дождаться, когда сетевая карта опомнится. А еще пароль в открытом виде. Красота!
Практический лайфхак: Добавляем проверку через `ping` перед подключением:
@echo off
:wait_for_network
ping -n 1 -w 1000 srv-fs01 > nul
if errorlevel 1 (
timeout /t 5 /nobreak
goto wait_for_network
)
net use Z: \\srv-fs01\shared /persistent:yes
Юмор: Мой рекорд — 17 таких bat-файлов у одного пользователя, которые запускали друг друга по цепочке. Система напоминала домино.
Метод 2: Планировщик заданий с триггером «При входе любого пользователя»
Более элегантный, но столь же капризный способ. Создаем задание в Планировщике, которое запускает тот же `net use`, но с триггером «При входе в систему».
Хитрость: Нужно было выставить галочку «Выполнять с наивысшими правами» и в настройках питания отключить «Останавливать задание, если компьютер переходит на питание от батареи» (да, на десктопах эта опция тоже есть, просто чтобы сбить с толку).
Практический пример создания задания через командную строку:
schtasks /create /tn "Map <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="52">Network</a> Drives" /tr "C:Scriptsmap_drives.bat" /sc onlogon /ru "SYSTEM" /rl highest
Проблема: Задание часто срабатывало раньше, чем появлялся доступ к домену. Результат — окно с ошибкой, пугающее пользователя до седых волн.
Средние века: Windows 10 и проблески интеллекта
Здесь Microsoft начала потихоньку думать. Появились более цивилизованные методы, но старые грабли никуда не делись.
Метод 1: Group Policy Preferences (GPP) — Мечта сисадмина
Настоящая магия. В групповой политике (gpedit.msc или доменная) есть узел Конфигурация пользователя -> Настройки -> Настройки дисков.
Создаем «Сетевой диск», указываем букву, путь, галочку «Подключаться повторно». И… вуаля! Политика сама, от имени пользователя, аккуратно всё подключает в нужный момент. Можно даже задавать разные диски для разных групп безопасности.
Почему это лучше? Не нужно хранить пароли, всё управляется централизованно, работает в 90% случаев. Остальные 10% — это когда пользователь сидит не в домене, или политика «не применяется» по таинственным причинам.
Метод 2: PowerShell скрипты и модуль SmbMapping
Для ценителей. Уже можно писать скрипты с логикой. Вот мой рабочий скрипт, который пережил 5 ребосов:
# Map-NetworkDrives.ps1
# Автор: Старый сисадмин, версия 12.7 (после 12 чашек кофе)
# Ждем появления <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="323">сети</a> (умнее, чем timeout!)
$networkAvailable = $false
$attempts = 0
while (-not $networkAvailable -and $attempts -lt 30) {
if (Test-Connection -ComputerName &quot;dc01.company.local&quot; -Count 1 -Quiet) {
$networkAvailable = $true
Write-Host &quot;Сеть доступна! Пытаемся подключить диски...&quot; -ForegroundColor Green
} else {
$attempts++
Start-Sleep -Seconds 2
Write-Host &quot;Ждем сеть... попытка $attempts из 30&quot; -ForegroundColor Yellow
}
}
if (-not $networkAvailable) {
Write-Error &quot;Нет сети. Диски не подключены. Идем пить кофе.&quot;
exit 1
}
# Функция для безопасного подключения диска
function Map-Drive {
param([string]$Letter, [string]$Path)
# Проверяем, не подключен ли уже диск
if (Test-Path &quot;${Letter}:&quot;) {
$existing = Get-SmbMapping -LocalPath &quot;${Letter}:&quot; -ErrorAction SilentlyContinue
if ($existing.RemotePath -eq $Path) {
Write-Host &quot;Диск ${Letter}: уже подключен к $Path&quot; -ForegroundColor Cyan
return
} else {
# Отключаем, если подключен к другому пути
Remove-SmbMapping -LocalPath &quot;${Letter}:&quot; -Force -ErrorAction SilentlyContinue
}
}
# Пытаемся подключить
try {
New-SmbMapping -LocalPath &quot;${Letter}:&quot; -RemotePath $Path -Persistent $true
Write-Host &quot;Успешно подключен диск ${Letter}: -&gt; $Path&quot; -ForegroundColor Green
}
catch {
Write-Warning &quot;Не удалось подключить диск ${Letter}: к $Path&quot;
Write-Warning &quot;Ошибка: $_&quot;
}
}
# Подключаем наши диски
Map-Drive -Letter &quot;Z&quot; -Path &quot;\\srv-fs01\shared&quot;
Map-Drive -Letter &quot;Y&quot; -Path &quot;\\srv-fs01\departments&quot;
Map-Drive -Letter &quot;X&quot; -Path &quot;\\srv-backup\archives&quot;
# Для пользователей из отдела кадров - особый диск
$userGroups = (whoami /groups)
if ($userGroups -match &quot;HR_Department&quot;) {
Map-Drive -Letter &quot;H&quot; -Path &quot;\\srv-fs01\hr_confidential&quot;
}
# Пишем лог (старая привычка)
$logEntry = &quot;$(Get-Date -Format &#039;yyyy-MM-dd HH:mm:ss&#039;) - Диски подключены для $env:USERNAME&quot;
$logEntry | Out-File -FilePath &quot;C:\Logs\DriveMappings.log&quot; -Append
Write-Host &quot;Все операции завершены. Можно работать!&quot; -ForegroundColor Green
И запускать его через ту же GPP или планировщик. Это уже серьезно. Это пахнет автоматизацией. И кофе.
Бонус: PowerShell однострочник для быстрой проверки
# Проверка и быстрое подключение одного диска
if (-not (Test-Path "Z:\")) {
net use Z: \\srv-fs01\shared /persistent:yes
} else {
Write-Host "Диск Z: уже подключен"
}
# Или более современно:
if (-not (Get-SmbMapping -LocalPath "Z:" -ErrorAction SilentlyContinue)) {
New-SmbMapping -LocalPath "Z:" -RemotePath "\\srv-fs01\shared" -Persistent $true
}
Новое время: Windows Server 2022 / Windows 11. Почти космос.
Здесь технологии шагнули вперед. Но пользователи остались прежними.
Золотой стандарт: Group Policy Preferences (всё ещё король)
GPP никуда не делся и стал только стабильнее. Он по-прежнему основной инструмент в домене. Добавилась интеграция с Azure AD, что открывает новые горизонты для головной боли в гибридных средах.
Продвинутая магия: Дискрипторы DFS-Namespace (DFS-N)
Это не просто монтирование диска. Это философия. Вместо пути `\\server\shared` вы даете пользователю путь `\\domain.local\namespace\shared`. Если сервер «упадет», вы перенесете ресурс на другой, а путь для пользователя останется прежним. Автомонтирование через GPP с такими путями — это высший пилотаж.
Практический пример PowerShell для работы с DFS:
# Подключение DFS-диска
New-SmbMapping -LocalPath "S:" -RemotePath "\\company.local\Data\Shared" -Persistent $true
# Проверка DFS-подключений
Get-DfsnFolderTarget -Path "\\company.local\Data\Shared" | Format-List
# <a href="https://it-apteka.com/nslookup-shpargalka-it-inzhenera-s-primerami-dlja-windows-i-linux-2-2/" title="DIG: продвинутая диагностика DNS для Linux и Windows" data-wpil-monitor-id="294">Скрипт для автоматического переподключения при смене сервера</a>
$dfsPath = "\\company.local\Data\Shared"
$localDrive = "S:"
# Получаем актуальный целевой сервер
$target = (Get-DfsnFolderTarget -Path $dfsPath | Where-Object { $_.State -eq 'Online' } | Select-Object -First 1).TargetPath
if ($target) {
# Отключаем старый mapping если есть
Remove-SmbMapping -LocalPath $localDrive -Force -ErrorAction SilentlyContinue
# Подключаем к актуальному target
New-SmbMapping -LocalPath $localDrive -RemotePath $target -Persistent $true
Write-Host "Подключен DFS диск $localDrive к $target" -ForegroundColor Green
}
Юмор: Объяснить это бухгалтере Люде — все равно что научить кота дифференциальному исчислению. «Но почему буква Z? Я привыкла к Z!»
Современный подход: Скрипты с проверкой сети и состоянием
Теперь мы можем сделать всё по уму. PowerShell-скрипт, который при входе:
# Advanced-DriveMapper.ps1
# Версия с обработкой ошибок, логированием и уведомлениями
param(
[Parameter(Mandatory=$false)]
[string]$ConfigFile = "C:\Config\DriveMappings.xml"
)
# Загрузка конфигурации
if (Test-Path $ConfigFile) {
$mappings = Import-Clixml -Path $ConfigFile
} else {
# Конфигурация по умолчанию
$mappings = @(
@{Letter="Z"; Path="\\srv-fs01\shared"; Required=$true},
@{Letter="Y"; Path="\\srv-fs01\projects"; Required=$false},
@{Letter="X"; Path="\\srv-backup\userdata"; Required=$false}
)
}
# Проверка доступности домена
function Test-DomainConnectivity {
$domainCheck = (Get-CimInstance -ClassName Win32_ComputerSystem).PartOfDomain
if (-not $domainCheck) {
Write-Warning "Компьютер не в домене. Пропускаем доменные ресурсы."
return $false
}
# Проверка доступности контроллера домена
$dc = (Get-ADDomainController -Discover -Service PrimaryDC).HostName
return (Test-Connection -ComputerName $dc -Count 2 -Quiet)
}
# Основной цикл подключения
$domainAvailable = Test-DomainConnectivity
foreach ($map in $mappings) {
$driveLetter = $map.Letter + ":"
$remotePath = $map.Path
# Пропускаем доменные ресурсы если нет домена
if (-not $domainAvailable -and $remotePath -match "\\\\.*\\") {
if ($map.Required) {
Write-Error "Не могу подключить обязательный диск $driveLetter - нет доступа к домену"
}
continue
}
# Проверяем доступность ресурса
if (Test-Path $remotePath) {
try {
$existing = Get-SmbMapping -LocalPath $driveLetter -ErrorAction SilentlyContinue
if ($existing -and $existing.RemotePath -ne $remotePath) {
Write-Host "Переподключаем диск $driveLetter..." -ForegroundColor Yellow
Remove-SmbMapping -LocalPath $driveLetter -Force
}
if (-not (Test-Path $driveLetter)) {
New-SmbMapping -LocalPath $driveLetter -RemotePath $remotePath -Persistent $true
Write-Host "Диск $driveLetter подключен к $remotePath" -ForegroundColor Green
}
}
catch {
Write-Warning "Ошибка при подключении $driveLetter : $_"
}
} else {
Write-Warning "Ресурс $remotePath недоступен"
}
}
# Отправляем уведомление пользователю (если нужно)
if ((Get-SmbMapping).Count -gt 0) {
$notification = @"
Сетевые диски подключены:
$((Get-SmbMapping | Format-Table LocalPath, RemotePath -AutoSize | Out-String))
"@
Write-Host $notification
}
# Логируем результат
$logData = @{
Timestamp = Get-Date
User = $env:USERNAME
Computer = $env:COMPUTERNAME
Drives = Get-SmbMapping | Select-Object LocalPath, RemotePath, Status
}
$logData | Export-Clixml -Path "C:\Logs\DriveMapping_$(Get-Date -Format 'yyyyMMdd').xml"
Универсальные грабли всех времен и народов
Независимо от ОС, вас будут преследовать:
- Кэшированные учетные данные: Пользователь когда-то ввел другой пароль к ресурсу, и Windows упорно пытается использовать его. Лечится чисткой в «Диспетчере учетных данных».
- Разная скорость загрузки: Ноутбук в быстрой корпоративной сети и тот же ноутбук в отеле с допотопным Wi-Fi. Скрипты должны это учитывать.
- Человеческий фактор: Самая сложная переменная в любом уравнении. Люда из бухгалтерии будет звонить и говорить, что «диск сломался», потому что она случайно удалила ярлык с рабочего стола.
Полезные команды для диагностики:
# Просмотр текущих подключений net use # Или Get-SmbMapping # Очистка всех сетевых дисков net use * /delete /y # Просмотр кэшированных учетных данных cmdkey /list # Удаление конкретных учетных данных cmdkey /delete:сервер
Итог: Мудрость, выстраданная годами (и литрами кофе)
Итак, краткий гид выживания:
- Windows 7 (если ещё жива): GPP или планировщик с умными задержками. Bat-файлы — только в музее.
- Windows 10/11: GPP — ваш лучший друг. Для сложных сценариев — PowerShell скрипты с проверкой сети.
- Windows Server 2016-2022 (пользовательские рабочие столы): GPP + DFS-Namespace. Это профессионально, надежно и масштабируемо.
Мой золотой скрипт на все случаи жизни:
# QuickDriveMapper.ps1 - работает везде, где есть PowerShell 3.0+
# Просто сохраните и запустите от администратора
$drives = @{
"Z" = "\\srv-fs01\shared"
"Y" = "\\srv-fs01\departments"
"X" = "\\srv-backup\archives"
}
foreach ($drive in $drives.GetEnumerator()) {
$letter = $drive.Key + ":"
$path = $drive.Value
if (Test-Connection -ComputerName ($path -replace '^\\\\([^\\]+).*','$1') -Count 1 -Quiet) {
try {
net use $letter $path /persistent:yes 2>&1 | Out-Null
Write-Host "[OK] $letter -> $path" -ForegroundColor Green
} catch {
Write-Host "[FAIL] $letter" -ForegroundColor Red
}
} else {
Write-Host "[SKIP] $path недоступен" -ForegroundColor Yellow
}
}
Write-Host "`nГотово! Дисков подключено: $( (net use | Select-String ':').Count )"
Помните: идеального метода нет. Всегда будет тот самый случай, когда «оно само». Но с правильно настроенным GPP, DFS-N и парой хороших скриптов вы, по крайней мере, сможете спокойно пить кофе, когда раздается звонок от Люды. А может, даже и объясните ей дифференциальное исчисление. Или просто переподключите диск.
Системный администратор с 20-летним стажем, потративший 149 из 150 единиц IQ на борьбу с сетевыми дисками. Последнюю единицу храню для разгадывания кроссвордов и написания скриптов, которые работают с первого раза. (Шучу, такого не бывает).




тема автомонтирования сетевых дисков в Windows — это целая эпопея для любого сисадмина. Добавлю несколько рабочих методов из своей практики и, что не менее важно, — как корректно всё отключить, когда это нужно.
Альтернативные рабочие способы автомонтирования:
Через реестр (Windows 7/10/11). Можно добавить сетевой диск прямо в ветку автозагрузки реестра для текущего пользователя:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
В качестве значения указать: cmd /c «net use Z: \\server\share /persistent:yes». Способ простой, но не самый безопасный и управляемый.
Скрипт входа (Logon Script) в групповой политике AD. Классика доменной инфраструктуры. В политике (Политика пользователя -> Конфигурация Windows -> Сценарии -> Сценарий входа) указывается путь к BAT или PS1-файлу. Управляется централизованно, но требует домена.
Использование Startup-папки. Для единичных случаев или тестирования можно просто поместить ярлык на BAT/PS1-скрипт в папку автозагрузки пользователя: %AppData%\Microsoft\Windows\Start Menu\Programs\Startup.
Через PowerShell профиль. Для продвинутых пользователей можно добавить команды подключения в профиль PowerShell ($PROFILE). Диски будут подключаться при каждом запуске консоли.
Важно: Как правильно размонтировать (отключить) сетевые диски.
Автоматизация — это хорошо, но часто нужно и откатывать изменения. Вот команды, которые спасают:
Классическая CMD (работает везде):
net use Z: /delete — удалить конкретный диск Z.
net use * /delete /y — ВАЖНО: осторожно! Удаляет ВСЕ активные сетевые подключения без подтверждения.
PowerShell (более современно и гибко):
Remove-SmbMapping -LocalPath «Z:» -Force — удалить диск Z.
Get-SmbMapping | Where-Object {$_.RemotePath -like «*server*»} | Remove-SmbMapping -Force — удалить все диски, подключенные к конкретному серверу.
Get-SmbMapping | Remove-SmbMapping -Force — удалить все смонтированные сетевые диски.
Через GUI: Не забываем про «Этот компьютер» → «Подключить сетевой диск» → «Отключить сетевой диск».
Мой совет для надёжности: комбинируйте методы. Для массового развёртывания в домене — GPP (Group Policy Preferences). Для сложной логики (проверка доступности, разные пути для ноутбуков) — PowerShell-скрипт, запускаемый через ту же GPP или Планировщик заданий. А bat-файлы оставьте для истории или экстренного ремонта старых систем.
Спасибо автору за подробный экскурс и отличные примеры кода! Прямо ностальгия нахлынула по всем этим вечным проблемам с 0x80070043 — Сетевое имя не найдено.