<# Fix-SMBSelfAccess.ps1 - SMB 자기접속(\\localhost, \\컴퓨터이름) 안 되는 문제를 한방에 복구 - 우리가 방금 수동으로 했던 모든 조치를 자동화 옵션(필요시 아래 파라미터만 바꿔서 사용): $EnableSMB1 = $true # 구형 장비 호환 필요 시 $EnableSMBDirect = $true # 최신 SMB 성능(3.0 RDMA) 켜기 (하드웨어 미지원이면 그냥 무시됨) $AllowGuest = $true # 아이디/비번 없이 접속 허용(게스트 허용 + Everyone 권한) $DisableLoopbackBlock = $true # 자기 IP(예: \\192.168.x.x)로 접근도 허용 $ShareName = 'PUBLIC_SHARE' $SharePath = 'C:\Users\Public' #> # ===== 사용자 설정 ===== $EnableSMB1 = $false $EnableSMBDirect = $true $AllowGuest = $false # 손님PC가 비번 없이 들어오게 하려면 $true $DisableLoopbackBlock = $true $ShareName = 'PUBLIC_SHARE' $SharePath = 'C:\Users\Public' # ===== 관리자 권한 체크 ===== $principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if(-not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)){ Write-Host "⚠️ 관리자 PowerShell로 다시 실행하세요." -ForegroundColor Yellow break } Write-Host "=== Fix-SMBSelfAccess: 시작 ===" -ForegroundColor Cyan function Try-Run($scriptBlock, $desc){ try { & $scriptBlock; Write-Host " ✅ $desc" -ForegroundColor Green } catch { Write-Host " ❌ $desc : $($_.Exception.Message)" -ForegroundColor Red } } # 1) NIC 바인딩(클라이언트/서버) 보장 Try-Run { Get-NetAdapter | % { Enable-NetAdapterBinding -Name $_.Name -ComponentID ms_msclient -ErrorAction SilentlyContinue Enable-NetAdapterBinding -Name $_.Name -ComponentID ms_server -ErrorAction SilentlyContinue } } "NIC 바인딩(ms_msclient/ms_server) 활성화" # 2) SMB 핵심 서비스/드라이버 종속성 재구성 + 자동시작 Try-Run { & sc.exe config LanmanWorkstation depend= bowser/mrxsmb20/nsi/rdbss } "LanmanWorkstation 종속성 복구" Try-Run { & sc.exe config LanmanWorkstation start= auto } "LanmanWorkstation 자동 시작" Try-Run { Set-Service -Name LanmanServer -StartupType Automatic } "LanmanServer 자동 시작" Try-Run { Set-Service -Name LanmanWorkstation -StartupType Automatic } "LanmanWorkstation 자동 시작(확인)" # 3) ImagePath/ServiceDll 고정 Try-Run { reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation" /v ImagePath /t REG_EXPAND_SZ /d "%SystemRoot%\System32\svchost.exe -k NetworkService -p" /f | Out-Null reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters" /v ServiceDll /t REG_EXPAND_SZ /d "%SystemRoot%\System32\wkssvc.dll" /f | Out-Null } "Workstation 서비스 ImagePath/ServiceDll 복구" # 4) 루프백(자기 IP로 접근) 허용 if($DisableLoopbackBlock){ Try-Run { reg add "HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" /v DisableLoopbackCheck /t REG_DWORD /d 1 /f | Out-Null } "자기 IP 루프백 접근 허용(DisableLoopbackCheck=1)" } # 5) (선택) SMB 기능 강화 if($EnableSMB1){ Try-Run { dism /online /enable-feature /featurename:SMB1Protocol /all /NoRestart | Out-Null } "SMB1 활성화(호환용)" } if($EnableSMBDirect){ Try-Run { dism /online /enable-feature /featurename:SMBDirect /all /NoRestart | Out-Null } "SMBDirect 활성화" } # 6) 방화벽 예외 (한글/영문 그룹명 모두 시도) Try-Run { netsh advfirewall firewall set rule group="파일 및 프린터 공유" new enable=yes | Out-Null } "방화벽: 파일 및 프린터 공유(한글)" Try-Run { netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes | Out-Null } "방화벽: File and Printer Sharing(영문)" # 7) (선택) 게스트 허용(아이디/비번 없이 접속) if($AllowGuest){ Try-Run { # Workstation(클라이언트) 쪽: Insecure Guest 허용 reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\LanmanWorkstation" /v AllowInsecureGuestAuth /t REG_DWORD /d 1 /f | Out-Null # 서버 쪽: 게스트 모델 강제(ForceGuest=1) reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v ForceGuest /t REG_DWORD /d 1 /f | Out-Null # 로컬 보안정책 상, 빈 암호 제한 완화(선택) — 필요 시 0 reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v LimitBlankPasswordUse /t REG_DWORD /d 0 /f | Out-Null } "게스트/무암호 접속 허용(기업환경 비권장)" } # 8) 테스트용 공유 만들기(원하면 경로/이름 바꿔서 사용) Try-Run { if(-not (Test-Path $SharePath)){ New-Item -ItemType Directory -Path $SharePath -Force | Out-Null } # NTFS Everyone Full (S-1-1-0 = Everyone) & icacls $SharePath /grant *S-1-1-0:(OI)(CI)F /T /C | Out-Null # 공유 권한 Everyone Full & net share $ShareName | Out-Null if($LASTEXITCODE -ne 0){ & net share $ShareName="$SharePath" /GRANT:Everyone,FULL /REMARK:"Auto-created by Fix-SMBSelfAccess" | Out-Null } } "테스트 공유($ShareName -> $SharePath) 준비" # 9) 핵심 서비스 기동 Try-Run { Start-Service -Name nsi -ErrorAction SilentlyContinue } "NSI 시작" Try-Run { Start-Service -Name rdbss -ErrorAction SilentlyContinue } "RDBSS 시작" Try-Run { Start-Service -Name LanmanServer -ErrorAction SilentlyContinue } "LanmanServer 시작" Try-Run { Start-Service -Name LanmanWorkstation -ErrorAction SilentlyContinue } "LanmanWorkstation 시작" # 10) 상태/점검 Write-Host "`n=== 서비스 상태 ===" -ForegroundColor Cyan Get-Service LanmanWorkstation, LanmanServer | Format-Table -Auto Write-Host "`n=== 포트 445 점검 ===" -ForegroundColor Cyan (netstat -an | Select-String ":445 ") | ForEach-Object { $_.ToString() } Write-Host "`n=== 공유 목록 ===" -ForegroundColor Cyan & net view \\localhost Write-Host "`n📂 탐색기 열기 시도(안 열리면 수동으로 Win+R -> \\localhost 입력)" -ForegroundColor Cyan Start-Process "\\localhost" -ErrorAction SilentlyContinue Write-Host "`n=== Fix-SMBSelfAccess: 완료 ===" -ForegroundColor Cyan Write-Host "이제 Win + R -> \\localhost 또는 \\$env:COMPUTERNAME 로 들어가면 됩니다." -ForegroundColor Green if($AllowGuest){ Write-Host "※ 게스트 무암호 허용 모드입니다. 사내망 외부 노출 시 보안상 비권장!" -ForegroundColor Yellow }