다음을 통해 공유


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의 로그온에서 실행되는 애플리케이션 개발을 참조하세요.