2013-12-10 16 views
0

안녕하세요, Windows XP에서 시간대를 변경하려고하는데 다음은이 guide입니다. 나는 C++을 사용하고 있으며 적절한 권한 플래그가 설정되어 있지 않은 것 같습니다. 다음은 코드입니다 :Windows에서 표준 시간대 변경 xp

TIME_ZONE_INFORMATION tzInfo, tzInfoNew, tzInfoTest; 
DWORD dwRet; 

HANDLE hToken; 
TOKEN_PRIVILEGES tkp; 

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); 
LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME , &tkp.Privileges[0].Luid); 
tkp.PrivilegeCount = 1; 
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 

dwRet = GetTimeZoneInformation(&tzInfo); 
std::wcout << "STANDARD NAME: " << tzInfo.StandardName << std::endl; 

tzInfoNew.Bias = tzInfo.Bias + 60; 
StringCchCopy(tzInfoNew.StandardName, 32, L"Nikola Time Zone"); 
tzInfoNew.StandardDate.wMonth = 10; 
tzInfoNew.StandardDate.wDayOfWeek = 0; 
tzInfoNew.StandardDate.wDay = 5; 
tzInfoNew.StandardDate.wHour = 2; 

StringCchCopy(tzInfoNew.DaylightName, 32, L"Nikola Daylight Zone"); 
tzInfoNew.DaylightDate.wMonth = 4; 
tzInfoNew.DaylightDate.wDayOfWeek = 0; 
tzInfoNew.DaylightDate.wDay = 1; 
tzInfoNew.DaylightDate.wHour = 2; 
tzInfoNew.DaylightBias = -60; 


if(!SetTimeZoneInformation(&tzInfoNew)) 
{ 
    printf("STZI failed (%d)\n", GetLastError()); 
} 
dwRet = GetTimeZoneInformation(&tzInfoTest); 
std::wcout << "STANDARD NEW NAME: " << tzInfoTest.StandardName << std::endl; 
std::wcout << "STANDARD NEW DAYLIGHT NAME: " << tzInfoTest.DaylightName << std::endl; 

tkp.Privileges[0].Attributes = 0; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); 

편집 : 내 프로젝트에서이 방법을 삽입 한, 나는 몇 가지 이상한 문제가 있습니다. 어쨌든 나는 다음과 같은 구조를 사용하고 있습니다 :

bool::setTimeZone(short int timeZone, short int dstOffset, dstDate& sDate, dstTime& sTime, dstDate& eDate, dstTime& eTime){ 
    bool res = true; 

    TIME_ZONE_INFORMATION tzInfoNew; 

    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 

    // Get the necessary priviledge to perform time zone setting operation 
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); 
    LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME , &tkp.Privileges[0].Luid); 
    tkp.PrivilegeCount = 1; 
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 

    // Fill the TIME_ZONE_INFORMATION structure 
    ZeroMemory(&tzInfoNew, sizeof(tzInfoNew)); 
    tzInfoNew.Bias = (LONG) -timeZone; 

    // Start of DST 
    // If the following six lines are executed, then setting the time zone fails 
    // i.e. it goes with result status 0, but the time zone is not changed 
    tzInfoNew.DaylightDate.wMonth = sDate.month; 
    tzInfoNew.DaylightDate.wDayOfWeek = sDate.week; 
    tzInfoNew.DaylightDate.wDay = sDate.day; 
    tzInfoNew.DaylightDate.wHour = sTime.hour; 
    tzInfoNew.DaylightDate.wMinute = sTime.minute; 
    tzInfoNew.DaylightBias = dstOffset; 

    // End of DST 
    tzInfoNew.StandardDate.wMonth = eDate.month; 
    tzInfoNew.StandardDate.wDayOfWeek = eDate.week; 
    tzInfoNew.StandardDate.wDay = eDate.day; 
    tzInfoNew.StandardDate.wHour = eTime.hour; 
    tzInfoNew.StandardDate.wMinute = eTime.minute; 

    if(!SetTimeZoneInformation(&tzInfoNew)) { 
    printf("STZI failed (%d)\n", GetLastError()); 
    res = false; 
    } 

    tkp.Privileges[0].Attributes = 0; 
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); 

    return (res); 
} 

그래서 SetTimeZoneInformation 상태 확인을 반환하지만 시간대가 설정되지 않은 : 여기

typedef struct { 
    unsigned short month; 
    unsigned short week; 
    unsigned short day; 
} dstDate; 

typedef struct { 
    unsigned short hour; 
    unsigned short minute; 
    unsigned short second; 
} dstTime; 

을 그리고 것은 함께 온 방법이다. 그리고 DaylightDate 정보가 설정되어있을 때만 문제가 발생합니다. 그렇지 않으면 문제가되지 않습니다.

+0

오류 값은 무엇입니까? [documentation] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724944%28v=vs.85%29.aspx)에는 '이 응용 프로그램에는이 함수에 대한 SE_TIME_ZONE_NAME 권한이 있어야합니다. 성공합니다. "예제 코드도 있습니다. –

+0

SE_TIME_ZONE_NAME은 (는) Windows Vista 이후 구현되었으므로 XP에서는 사용할 수 없습니다. 설명서에 XP SE_SYSTEMTIME_NAME을 사용해야한다고 명시되어 있습니다. 함수가 0을 반환하는 오류는 없습니다. 그러나 표준 시간대 정보를 나중에 검색하면 표준 시간대가 변경되지 않았 음을 알 수 있습니다. – nikolakoco

+0

맞습니다. XP 메모를 놓쳤습니다. 죄송합니다. –

답변

1

데이터를 설정하기 전에 TimeZoneInformation 구조에 ZeroMemory 매크로를 사용하지 않았다는 문제점을 발견했습니다.

ZeroMemory(&tzInfoNew, sizeof(tzInfoNew)); 
tzInfoNew.Bias = 0; 
StringCchCopy(tzInfoNew.StandardName, 32, L"Test Time Zone"); 
..... 

나는 그것을 사용하는 것이 부적절하다고 생각했다. 그러나 그것은 트릭을했고 나는 모든 필요한 정보를 설정하고 구조가 시간대 설정의 순간에 가득 찼기 때문에 왜 그렇게 확신하지 못합니다.

+0

당신이 그것을 알아 낸 것을 기쁘게 생각합니다. 'StandardBias'처럼 보이고,'SYSTEMTIME' 구조체의 일부 변수는 초기화없이 초기화되지 않았을 것입니다. 그리고 그것을 채우기위한 복잡한 규칙에 따라 당신은 거의 이상한 충돌을 보장합니다. –

+0

네 말이 맞지만 오류 코드가 없다는 것을 혼란스러워했다. – nikolakoco

+0

지금 새로운 문제가있다. 문제의 EDIT 섹션을 참조하십시오. – nikolakoco