Windows에서 Linux의 wget 이나 curl 비슷한 기능 실행하기

아무래도 GUI를 기본으로 하는 Windows라는 OS는 Command line 도구들이 조금 빈약합니다.
간단한 테스트나 다운로드를 위해 Linux에서 wget이나 curl을 많이 사용했는데,
Windows에 없어서 조금 불편할 때가 있습니다.
그나마 PowerShell을 통해 아래 명령어로 약간 비슷하게 흉내는 낼 수 있습니다.

# System.Net.WebClient 사용하기
$client = New-Object System.Net.WebClient
$client.DownloadFile("http://www.example.com/file.txt","C:\tmp\file.txt")
# Invoke-WebRequest 사용하기
Invoke-WebRequest -OutFile index.html http://www.example.com

그래도 영… wget이나 curl을 Windows 버전으로 구하는 게…

Windows 10 업데이트 KB4493509 설치 중 0x8e5e03fa 발생할 경우

Windows Update 문제 해결사를 실행해 본다

Windows 설정 > 업데이트 및 보안 > 문제 해결 > Windows 업데이트
이렇게 해서 문제 하결이 안되면 다음으로

Windows Update 서비스 관련 초기화

관리자 쉘을 엽니다. (이제 Windows 10 에서 기본이 PowerShell 인데, 명령 프롬프트여도 무방)
아래 명령을 하나씩 실행합니다.

net stop wuauserv
net stop cryptsvc
net stop bits
net stop msiserver
ren C:\Windows\SoftwareDistribution SoftwareDistribution.old
ren C:\Windows\System32\catroot2 catroot2.old
net start wuauserv
net start cryptsvc
net start bits
net start msiserver

이제 컴퓨터릴 재시작 하고 나서 업데이트를 재시도 합니다.
그리고 나서 이제 불필요해진 .old 폴더를 찾아가서 삭제합니다.
그래도 안되면…

이제 희망이 거의 없다

마지막으로 기대 볼 만한 것은​

서드파티 보안 솔루션 삭제 (쉽게 얘기하면 은행 사이트, 정부 사이트 등에서 마구 설치하는 잡다하고 세상 쓸모 없는 녀석들)

​그래도 안되면… 정상적인 업데이트 파일을 받을 수 있는지 확인…
당연히 인터넷이 안정적이여야 하고,

Windows 설정 > 시간 및 언어 > 지역 > 국가 또는 지역… 지역이 이상하면 해당 지역과 언어에 맞는 업데이트 파일을 받지 못할 수 있다고 하네요…

​그래도 안되면 시스템 파일 검사 (당연히 관리자 권한으로)

sfc /scannow
DISM /Online /Cleanup-Image /RestoreHealth

그래도 안되면 msconfig를 실행해서 일반 > 시작 모드 선택 을 선택 모드로 하고
시스템 서비스만 로드하고, 시작 항목은 로드 하지 않도록 한 뒤,
서비스 탭 (msconfig 의 3번째 탭)에서 Microsoft의 서비스를 제외한 나머지를 모두 사용 안함 처리
그리고 재시작 해서 시도…

아마 여기까지 오면 포맷 하거나 초기화를 하는 것이 나을지도 모르겠습니다.

마지막으로는 Windows Update Catalog 사이트에서 해당 업데이트를 받아서 직접 설치를 시도해 봅니다.

https://www.catalog.update.microsoft.com/Home.aspx

​이제 해결이 되었나요?

해결 되었으면 좋겠네요…
BS는 서비스 관련 초기화를 했더니 해결 되었습니다.

Windows 10 1809 다중 사용자 환경

BS가 iMac + Boot Camp 로 Windows 10 Pro 를 설치해서 사용 중입니다.
그리고 Windows 10 에 BS, 아내, 아이들 4개의 계정을 만들었습니다.
그런데 Windows 10 이라는 Desktop 용 OS의 기본 동작 중 하나가 불편을 줍니다.
최근 사용한 사용자를 자동으로 로그인 시키고, 이전에 실행 중이던 프로세스를 자동으로 실행하는 기능입니다.
PC를 혼자서 사용할 때에는 유용할 수 있는 기능이지만 다중 사용자 환경에서는 아래와 같은 상황이 벌어집니다.

  • PC를 켜서 BS가 사용 후 시스템 종료
  • PC를 켜서 아이가 사용
  • 아이가 PC를 종료하려고 하면 BS의 계정이 로그인 되어 있는데 종료하겠냐고 확인함
  • 아이는 아빠가 하던 무언가가 사라질까 걱정되어 PC를 종료하지 못함

유저가 아래의 설정에서 해당 기능을 On/Off 할 수 있습니다.

설정 > 계정 > 로그인 옵션 > “업데이트하거나 다시 시작한 후 내 로그인 정보를 사용하여 내 디바이스 설정을 완료합니다”

하지만 계정마다 설정해야 하는 문제가 있기 때문에 아래와 같은 방법으로 시스템 설정을 바꾸는 것이 좋습니다.

  • gpedit.msc 를 실행합니다.
  • 컴퓨터 구성 > 관리 템플릿 > Windows 구성 요소 > Windows 로그온 옵션 항목으로 이동합니다.
  • “Sign-in last interactive user automatically after a system-initiated restart” 라는 항목의 구성을 “사용 안 함”으로 설정합니다.

레지스트리 값 경로

  • 키: HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System
  • 값 이름: DisableAutomaticRestartSignOn
  • 위 값이 존재하지 않을 때 : 구성하지 않음 (Not Configured) (기본값)
  • 위 값이 0 : 사용 (자동 로그인 됨)
  • 위 값이 1 : 사용 안 함 (자동 로그인 되지 않음)

Windows 10 의 다중 사용자 환경에서 잊지 않고 설정하세요.
참고자료: https://docs.microsoft.com/ko-kr/windows-server/identity/ad-ds/manage/component-updates/winlogon-automatic-restart-sign-on–arso-

Windows 설치 목록에서 숨기는 방법

BS가 Boot Camp로 Windows를 사용하는데, 바보같은 Apple의 드라이버 설치가 엄청나게 설치 목록에 뜨게 되었습니다.
BS의 다른 가족 3명이 모두 컴맹인지라 혹여나 이것들을 삭제할까 걱정되어 숨기고 싶었습니다.
역시나… Windows는 방법이 있습니다.
레지스트리에서 설치 제거 항목을 찾아 갑니다.
보통 아래의 경로 중에 하나에 존재합니다.
HKLM/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
HKLM/SOFTWARE/Wow6432Node/Microsoft/Windows/CurrentVersion/Uninstall
숨기고자 하는 항목의 키를 찾습니다.
해당 키에 DWORD의 값을 하나 추가합니다. 이름은 SystemComponent
이름대로 값은 1로 설정합니다.
이제 프로그램 및 기능 또는 Windows 10의 앱 설정 화면에서 해당 항목이 보이지 않게 됩니다.

맥용 키보드를 Windows 에서 사용하기 위한 키보드 배열 수정

어쩌다보니 iMac + Mojave + Bootcamp + Windows 10 1809 를 사용하게 되었습니다.
맥용 키보드와 Windows용 키보드의 배열이 달라서 조금 불편함이 있습니다.
참고로 BS는 NumPad가 있는 애플 정품 키보드를 사용 중입니다.

일단 BS는 취미로 각종 개발툴을 사용하는데 여기에서 자주 쓰이는 단축키인 Shift + Space 를 버릴 수 없습니다.
따라서 Windows 의 101A 타입으로 키배열을 설정했습니다.
101A 타입은 우측 Alt 키를 한/영 전환키로, 우측 Ctrl 키를 한자키로 사용합니다.

macOS는 Command 키를 자주 사용하고 기본 한/영 전환이 CapsLock 또는 Shift + Space에 바인딩 되어 있습니다.
Windows는 Ctrl, Alt 키를 자주 사용합니다. 그리고 101A에서 우측 Alt가 한영 전환입니다.
사용해보면 Left Alt와 Right Alt(한영)을 사용할 때 엄지 손가락으로 누르기가 굉장히 불편합니다.

그리고 Print Screen, Scroll Lock, Pause, Insert, NumLock 은 보이지도 않습니다.

우선 Windows를 Bootcamp로 설치하고 나서 드라이버 설치가 끝난 상태면
Bootcamp를 통해서 F1 ~ F12 의 키를 멀티미디어 키가 아닌 Function키로 설정할 수 있습니다.

이렇게 하고 나면

F14 (Home 키 위에 위치) -> Print Screen
F15 (PageUp 키 위에 위치) -> Scroll Lock
F16 (NumPad의 Clear 키 위에 위치) -> Pause
fn (Home 키 왼쪽에 위치) + return -> Insert

이렇게 해서 사용할 수 있게 됩니다. 여전히 Windows용 키의 Application 키(마우스 우클릭 했을 때 메뉴가 나오게 하는 키)가 없습니다.

BS는 여기에서 약간의 배열 변경을 추가하였습니다.

왼쪽 Command -> 왼쪽 Alt
왼쪽 Alt -> 왼쪽 Win
오른쪽 Command -> 한/영 (101A의 오른쪽 Alt)
오른쪽 Alt -> Application 키
F13 (fn 위에 위치) -> Insert 키

fn키는 별도의 스캔코드를 가지지 않는 하드웨어 키 조합용으로 사용할 수 없습니다. ㅜㅜ

이렇게 해서 최대한 Windows용 키보드 배열과 유사하게 수정해서 사용 중입니다.
마우스도 바꿨습니다. 원버튼뿐인 맥용 매직 마우스는 봉인하고 유사?한 디자인의 APOINT M302 화이트로…

이제 좀 Windows 답게 사용할 수 있네요.

… 이제 본론 입니다.

키보드 배열을 바꾸기 위한 레지스트리(Registry) 편집
(잘 모르면 시도하지 마세요. 까닥 잘못하면 키보드 입력이 안되어 문제가 될 수 있습니다.)

키 위치: HKLM/SYSTEM/CurrentControlSet/Control/Keyboard Layout
값 이름: Scancode Map
값 타입: 이진값(Binary)

입력은 보통 8바이트 단위로 줄바꿈이 되는데 설명을 위해 4바이트 단위로 잘랐습니다.

00 00 00 00 처음 8 바이트는 무조건 0
00 00 00 00
06 00 00 00 5개의 배열을 지정하기 위해 6 (5 + 1) 입력
38 00 5b e0 E0_5B(Left Command) -> 00_38(Left Alt)
5b e0 38 00 00_38(Left Option) -> E0_5B(Left Win)
38 e0 5c e0 E0_5C(Left Command) -> E0_38(Right Alt, 한영)
5d e0 38 e0 E0_38(Right Option) -> E0_5D(Application)
52 e0 64 00 00_64(F13) -> E0_52(Insert)
00 00 00 00 마지막 4 바이트는 무조건 0

원래대로 돌리고 싶으면 해당 값을 지우면 됩니다.
변경 후에는 Reboot이 필요합니다.

만약 다중 사용자 환경에서 본인만 바꿔서 사용하고 싶으면 키보드 후킹을 구현하거나, AutoHotkey와 같은 유틸리티를 사용하는 것을 권장합니다.

그리고 마지막 보너스
키보드의 스캔 코드를 구하는 간단한 소스입니다.
핵심은 “RegisterRawInputDevices()으로 등록하고, GetRawInputData() 으로 가져온다” 입니다.
.NetFramework 4를 지정해서 빌드한 Release 파일도 포함되어 있습니다.

Hyper-V 위에 Ubuntu 설치하기

기본 설치

[MS 참고글]

  1. 보안 부팅 사용을 해제하고
  2. Ubuntu 16.04 LTS를 설치한 후
  3. 아래의 명령으로 추가 패키지를 설치한다
    apt-get update
    apt-get -y install linux-virtual-lts-xenial linux-tools-virtual-lts-xenial linux-cloud-tools-virtual-lts-xenial linux-image-virtual
    
  4. 마지막으로 2세대 VM을 만들었다면 아래 과정을 진행
    cd /boot/efi/EFI
    sudo cp -r ubuntu/ boot
    cd boot
    sudo mv shimx64.efi bootx64.efi
    

VNC 설정

원격에서 GUI 프로그램을 실행하기 위한 방법

참고자료: [Medium.com의 자료]

# 관련 패키지 설치
# gnome-panel: 런처와 태스크바
# gnome-settings-daemon: 각종 설정을 편리하게 하기 위함
# metacity: 창 관리자
# nautilus: 파일 관리자
# gnome-terminal: 터미널
# vnc4server: VNC 서버
apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal vnc4server

# 설치 후 일단 실행
vnc4server

# 실행되고 나면 일단 종료
vnc4server -kill :1

# 시작 스크립트 편집
# 내용은 아래의 예제 파일 참고
vim ~/.vnc/xstartup

# 해상도를 지정해서 다시 실행
vnc4server -geometry 1280x800

#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &

gnome-panel &
gnome-settings-daemon &
metacity &
nautilus -n &
gnome-terminal &
# 한글이 필요하면 im-config

Hyper-V 연결시 해상도 변경

Hyper-V VM 설정에서 RemoteFx 기능을 사용하면 아래 방법이 통하지 않음

참고 글: [MSDN 벤 암스트롱 블로그]

/etc/default/grub 파일에서 아래 내용을

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”

아래와 같이 바꾼다

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash video=hyperv_fb:1600×1200″

그리고 아래 명령으로 GRUB 업데이트를 해주고 리붓

update-grub

동적 포트 범위(Dynamic port range) 수정

동적 포트 범위란?
TCP 의 포트라는 것은 0 ~ 65535 의 값을 가지는 2 바이트의 부호없는 정수인데
TCP/IP 를 사용하는 모든 소켓은 포트 번호가 지정되어야 한다.
응용프로그램이 서버로 동작하는 경우에도, 웹브라우저와 같이 클라이언트로 동작하는 경우에도 포트 번호는 지정된다.
대부분의 서버 프로그램은 자신이 사용할 포트 번호를 정적인 설정으로 가지고 있다.
예를 들면 웹서버는 80이나 443을 보통 사용하고, SSH 서버는 22을 사용한다.
하지만 클라이언트는 정적인 설정으로 포트번호를 지정하지 않는다.
그래서 OS가 이런 클라이언트 프로그램들에게 N ~ M 사이의 미사용 포트번호를 지정해 주는데
이 범위를 동적 포트 범위라고 한다.

그런데 이걸 왜 수정해야 하는데?

어떤 이유로 동적 포트 범위가 1025 ~ 60000 으로 지정되었다고 하자.
그리고 다른 이유로 해당 컴퓨터에서 RDP 를 사용한다고 하면
RDP 는 기본으로 3389를 사용하고, 이는 동적 포트 범위에 포함되기 때문에
RDP 서비스 이전의 다른 서비스가 동적 포트로 3389를 가져가면 RDP 서버는 실행이 되지 않는다.

인터넷 환경이 점점 발전함에 따라 동적 포트의 기본값도 바뀌었다.

To comply with Internet Assigned Numbers Authority (IANA) recommendations,
Microsoft has increased the dynamic client port range for outgoing connections in Windows Vista and Windows Server 2008.
The new default start port is 49152, and the new default end port is 65535.
This is a change from the configuration of earlier versions of Windows that used a default port range of 1025 through 5000.

<MS의 동적 포트 기본값에 대한 설명 중에서…>

아래의 명령들로 동적 포트 범위를 확인하고 설정할 수 있다

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
netsh int ipv4 set dynamicport tcp start=49152 num=16384
netsh int ipv4 set dynamicport udp start=49152 num=16384
netsh int ipv6 set dynamicport tcp start=49152 num=16384
netsh int ipv6 set dynamicport udp start=49152 num=16384

lsasrv 6037 오류로 인한 원격 데스크탑 연결 문제

원격 데스크탑 연결을 하려는데 lsasrv 6037 오류가 발생한다면
아래와 같이 레지스트리를 편집하여 해결?할 수 있다.

경로: HKLM/System/CurrentControlSet/Services/Lanmanserver/Parameters
이름: DisableStrictNameChecking
타입: DWORD
값: 1

경로: HKLM/System/CurrentControlSet/Control/Lsa
이름: DisableLoopbackCheck
타입: DWORD
값: 1