RunOnce 레지스트리 키
모든 버전의 Windows는 레지스트리 키인 RunOnce를 지원합니다. 이 키는 시스템에서 한 번 실행한 다음 삭제할 명령을 지정하는 데 사용할 수 있습니다. 드라이버 패키지에서 RunOnce 레지스트리 키를 만들 수 있습니다.
참고 항목
소프트웨어 전용 SWENUM 디바이스 이외의 다른 항목에 대해 RunOnce 레지스트리 키를 만드는 것은 드라이버 패키지 격리를 준수하지 않으며 Windows 드라이버에서 수행할 수 없습니다.
Windows 8 및 Windows 8.1 소프트웨어 전용 SWENUM 디바이스 설치를 위한 RunOnce 항목은 디바이스 설치 중에 처리됩니다. 다른 RunOnce 항목이 RunOnce 키에 추가됩니다. 다음 번에 시스템에서 RunOnce 키를 처리할 때 적용됩니다. 디바이스 설치는 시스템이 RunOnce 항목을 처리하도록 강제하지 않습니다.
Windows 7 및 이전 버전에서는 디바이스가 설치된 직후 Windows에서 RunOnce 키 아래에 저장된 명령을 실행한 다음 키를 제거합니다. 또한 시스템이 시작될 때마다 RunOnce 키 아래에 저장된 명령을 실행한 다음 키를 제거합니다. 따라서 RunOnce 키 아래에 명령을 배치하면 실행 시기를 쉽게 예측할 수 없습니다.
디바이스가 설치된 직후 Windows는 RunOnce 키 아래에 저장된 명령을 실행한 다음 키를 제거합니다. 또한 시스템이 시작될 때마다 RunOnce 키 아래에 저장된 명령을 실행한 다음 키를 제거합니다. 따라서 RunOnce 키 아래에 명령을 배치하면 실행 시기를 쉽게 예측할 수 없습니다.
디바이스 설치의 경우 INF AddReg 지시문을 통해 지정된 추가 레지스트리 섹션을 사용하여 RunOnce 레지스트리 키를 만들 수 있습니다. 각 추가 레지스트리 섹션 에는 다음 구문이 있습니다.
reg-root, [subkey], [value-entry-name], [flags], [value]
RunOnce 레지스트리 키에 대한 레지스트리 루트(reg-root) 및 하위 키 값은 다음과 같습니다.
HKLM, "Software\Microsoft\Windows\CurrentVersion\RunOnce"
Value-entry-name 문자열은 RunOnce 레지스트리 항목에서 생략됩니다. Flags 값으로 표시되는 항목의 형식은 REG_SZ(0x00000000 플래그 값) 또는 REG_EXPAND_SZ(0x00010000 플래그 값)이어야 합니다. REG_SZ 형식의 항목(기본값)의 경우 Flags 값을 생략할 수 있습니다.
RunOnce 키의 값 매개 변수는 실행할 명령을 지정합니다. 이 매개 변수는 다음 형식의 따옴표 붙은 문자열입니다.
Rundll32[.exe] DllName,EntryPoint[Arguments]
기본적으로 RunOnce 키는 지정된 명령이 실행된 후 삭제됩니다. RunOnce 키 값 매개 변수에 느낌표(!)를 접두사로 추가하여 명령이 성공적으로 실행될 때까지 키 삭제를 연기할 수 있습니다. 느낌표 접두사 없이 지정된 명령이 실패 하면 RunOnce 키가 계속 삭제되고 다음에 시스템이 시작될 때 명령이 실행되지 않습니다.
또한 기본적으로 시스템이 안전 모드에서 시작될 때 RunOnce 키는 무시됩니다. RunOnce 키의 값 매개 변수 앞에 별표(*)를 추가하여 명령이 안전 모드에서도 강제로 실행되도록 할 수 있습니다.
값 문자열 항목을 만들 때 다음 지침을 고려합니다.
Rundll32는 .exe 파일 이름 확장명을 포함하거나 사용하지 않고 나타날 수 있습니다.
DllName 은 DLL 또는 실행 파일 이미지의 전체 경로입니다. 필수 종료 쉼표 외에는 식에 쉼표가 포함되지 않아야 합니다. 파일 이름 확장명을 제공하지 않으면 기본 확장명은 .dll.
EntryPoint는 DllName으로 표시된 DLL 내의 진입점 이름입니다.
인수 는 지정된 DLL에 전달해야 하는 인수를 포함하는 선택적 부분 문자열입니다.
정확히 하나의 공간은 인수 부분 문자열에서 EntryPoint 문자열을 분리해야 합니다.
다음 코드 예제에서는 RunOnce 키 아래에 명령 및 해당 인수를 저장하는 추가 레지스트리 섹션 항목을 보여줍니다.
;; WDMAud swenum install
HKLM,%RunOnce%,"WDM_WDMAUD",,\
"rundll32.exe streamci.dll,StreamingDeviceSetup %WDM_WDMAUD.DeviceId%,%KSNAME_Filter%,%KSCATEGORY_WDMAUD%,%17%\WDMAUDIO.inf,WDM_WDMAUD.Interface.Install"
[Strings]
RunOnce = "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce"
WDM_WDMAUD.DeviceId = "{CD171DE3-69E5-11D2-B56D-0000F8754380}"
KSNAME_Filter = "{9B365890-165F-11D0-A195-0020AFD156E4}"
KSCATEGORY_WDMAUD = "{3E227E76-690D-11D2-8161-0000F8775BF1}"
디바이스 설치에 RunOnce 레지스트리 키를 사용하는 경우 다음 규칙이 적용됩니다.
이러한 레지스트리 키는 소프트웨어 디바이스 열거자인 SWENUM에 의해 열거된 소프트웨어 전용 디바이스의 설치에만 사용해야 합니다.
RunOnce 키는 Rundll32.exe 호출로만 구성되어야 합니다. 그렇지 않으면 WHQL은 드라이버 패키지에 디지털 서명하지 않습니다.
실행할 코드는 사용자 입력을 묻는 메시지를 표시해서는 안 됩니다.
서버 쪽 설치는 시스템 컨텍스트에서 실행됩니다. 이러한 이유로 실행할 코드에 보안 취약성이 없고 파일 권한으로 인해 코드가 악의적으로 수정되지 않도록 해야 합니다.
Windows Vista부터 관리자 권한이 없는 사용자가 시스템에 로그온된 경우 시스템에서 RunOnce 키로 지정된 명령을 실행하지 않습니다. 이로 인해 시스템을 다시 시작한 후 불완전하거나 손상된 설치가 발생할 수 있습니다.
디바이스 설치 애플리케이션에서 RunOnce 항목을 만들기 전에 시스템 다시 시작 후 관리자 권한이 있는 사용자가 로그온해야 한다는 사실을 현재 사용자에게 알릴 수 있습니다.
자세한 내용은 Windows Vista의 로그온에서 실행되는 애플리케이션 개발을 참조하세요.