Windows Vista����lj����ꂽ�l�X�ȋ@�\�̒��ŁA���Ƀ��[�U�[�̋������Ђ������̂́A UAC(User Account Control)�ł͂Ȃ����Ǝv���܂��B ���̋@�\�́A�Ǘ��҂Ƃ��ă��O�I�������ꍇ�ł��A�������[�U�[�Ƃ��ăv���Z�X�����s����Ƃ������̂ł���A ���ɂ��̂悤�ȃv���Z�X�ň��ӂ̂���R�[�h�����s���ꂽ�Ƃ��Ă��A���������s���₷���Ȃ�Ƃ������_������܂��B �������A���ۂɂ��̋@�\�ɂ��Đ[���l���Ă����ƁA�������̋^�₪�����Ă���Ǝv���܂��B ���Ƃ��A�������[�U�[�Ƃ��ăv���Z�X�����s�����Ȃ�A ���������Ǘ��҂Ƃ��ă��O�I���������Ƃɂ͂Ȃ�Ȃ��̂ł͂Ȃ��ł��傤���B �܂��A�������[�U�[�Ƃ��ăR�[�h�����s����邱�Ƃɂ��A �������̃v���Z�X�ł͊��Ăяo���Ɏ��s���邱�Ƃ��\�z����܂����A �����������͂ǂ��Ώ����邱�ƂɂȂ�̂ł��傤���B ����́A��������UAC�̋^����������邽�߂ɁA�����N�g�[�N���Ɖ��z���ɂ��Đ������܂��B
���[�U�[���V�X�e���Ƀ��O�I������ꍇ�ALSA(Local Security Authority)����_�Ƀg�[�N�����쐬���邽�߂̈�A�̏������s���܂��B ���O�I�������������ꍇ�A���̃��O�I���������[�U�[��\���g�[�N���ƃ��O�I���Z�b�V�������쐬����邱�ƂɂȂ�܂����A ������UAC���L���ɂȂ��Ă���ꍇ�́A�쐬���ꂽ�g�[�N����LSA�ɂ���Ē��ׂ��邱�ƂɂȂ�܂��B �����A�g�[�N�������i���������������Ă���ꍇ�́A���̃g�[�N������Ƀt�B���^�������ꂽ�g�[�N�����쐬����A ���̃t�B���^�������ꂽ�g�[�N�������2��ڂ̃��O�I�������s����܂��B �����āA�ŏI�I�ɂ́A�t�B���^�������ꂽ�g�[�N�����V�F���Ɋ��蓖�Ă��邱�ƂɂȂ�܂��B �t�B���^�����Ƃ����̂́A���i���������Ƃ�������O���[�v���g�[�N�����Ŗ����ɂ��邱�Ƃł���A �����t���g�[�N�����쐬����v�̂Ƃقړ���ł��B ���̂悤�Ȑ����t���g�[�N�����V�F���Ɋ��蓖�Ă��邱�Ƃɂ��A �V�F������N�������e�v���Z�X���������[�U�[�Ƃ��Ď��s����邱�ƂɂȂ�܂��B
�ȏ�̎����番����悤�ɁAUAC���L���ł���ꍇ�ł��Ǘ��҂Ƃ��Ẵ��O�I���͐������Ă��܂��B �b�����G�ɂȂ�̂́A�t�B���^�������ꂽ�g�[�N�����V�F���Ɋ��蓖�Ă��A ���S�ȃg�[�N��(�Ǘ��҂̃��O�I���ō쐬���ꂽ�g�[�N��)���v���Z�X����B������Ă��邩��Ȃ̂ł����A ���ۂɂ͂������̊m�F���@������܂��B ���Ƃ��ALsaEnumerateLogonSessions���Ăяo���A �������[�U�[���̃��O�I���Z�b�V������2�쐬����Ă��邱�Ƃ�������܂����A ����͊��S�ȃg�[�N���ƃt�B���^�������ꂽ�g�[�N����2���쐬����Ă��邩��ɑ��Ȃ�܂���B �܂��A���S�ȃg�[�N���ƃt�B���^�������ꂽ�g�[�N���݂͌��Ƀ����N���Ă���A �Е��̃g�[�N����������Е��g�[�N���̃n���h�����擾���邱�Ƃ��\�ɂȂ��Ă��܂��B ���̂悤�ȃ����N�g�[�N�����擾���������Ɏ����܂��B
#include <windows.h> int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { HANDLE hToken; DWORD dwLength; TOKEN_ELEVATION tokenElevation; TOKEN_LINKED_TOKEN linkedToken; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { MessageBox(NULL, TEXT("�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING); return 0; } if (!GetTokenInformation(hToken, TokenLinkedToken, &linkedToken, sizeof(TOKEN_LINKED_TOKEN), &dwLength)) { MessageBox(NULL, TEXT("�����N�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING); CloseHandle(hToken); return 0; } if (!GetTokenInformation(linkedToken.LinkedToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) { MessageBox(NULL, TEXT("���i���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING); CloseHandle(linkedToken.LinkedToken); CloseHandle(hToken); return 0; } if (tokenElevation.TokenIsElevated) MessageBox(NULL, TEXT("�����N�g�[�N���͏��i����Ă��܂��B"), TEXT("OK"), MB_OK); else MessageBox(NULL, TEXT("�����N�g�[�N���͏��i����Ă��܂���B"), TEXT("OK"), MB_OK); CloseHandle(linkedToken.LinkedToken); CloseHandle(hToken); return 0; }
�����N�g�[�N�����擾����ɂ́AGetTokenInformation��TokenLinkedToken���w�肵�܂��B UAC���L���łȂ��ꍇ�͂��̂悤�ȃg�[�N���͍쐬����Ă��Ȃ����߁A���͎��s���邱�ƂɂȂ�܂��B 2��ڂ�GetTokenInformation�Ɏw�肵�Ă���TokenElevation�́A�g�[�N�������i����Ă��邩���m�F���邽�߂̂��̂ŁA �����ł̓����N�g�[�N����Ώۂɂ��Ă��܂��B ���̌��ʁA�����N�g�[�N�������i���Ă���Ȃ�A���݃v���Z�X�Ɋ��蓖�Ă��Ă���g�[�N���̓t�B���^�������ꂽ�g�[�N���ł���A �����N�g�[�N�������i����Ă��Ȃ��Ȃ�A���݃v���Z�X�Ɋ��蓖�Ă��Ă���g�[�N���͊��S�ȃg�[�N���ł���ƕ�����܂��B �Ȃ��A�����N�g�[�N�������S�ȃg�[�N���ł������Ƃ��Ă��A �������ɋU�����s������A�v���Z�X���쐬�����肷�邱�Ƃ͓��R�ł��܂���B ���̂悤�ȑ�������s�����ꍇ�́AERROR_PRIVILEGE_NOT_HELD���Ԃ邱�ƂɂȂ�܂��B
�����āAUAC�ɂ����鉼�z���ɂ��Đ������܂��B ����́A�������̃X�g�A(�t�@�C���p�X��W�X�g���L�[)�ɑ��ď������݂�쐬�����s����ꍇ�A ���̃X�g�A�����ɂ��ď������݂�쐬���s���Ƃ������̂ł��B ���ɁA���z�����K�������X�g�A�������܂��B
���z�����K�������X�g�A | ���_�C���N�g����鉼�z�X�g�A |
---|---|
%ProgramFiles% | %LocalAppData%VirtualStore\Program Files |
%WinDir% | %LocalAppData%VirtualStore\Windows |
HKLM\Software | HKCU\Software\Classes\VirtualStore\Machine\Software |
��L�Ɏ����X�g�A�́A�A�v���P�[�V�����̃C���X�g�[�����Ȃǂɗ��p����܂����A �������ꂽ���[�U�[�ł́A���̂悤�ȃp�X�ɑ��Ă̏������݂�쐬�̓A�N�Z�X�����ۂ���܂��B ����ł́A�A�v���P�[�V����������ɓ��삷�邱�Ƃ��ł��Ȃ��Ȃ��Ă��܂����߁A ����Ƃ��ăA�N�Z�X�\�ȏꏊ(���z�X�g�A)��Ώۂɂ��܂��B ���Ƃ��A%ProgramFiles%�Ƀt�@�C�����쐬���悤�Ƃ���ƁA %LocalAppData%VirtualStore\Program Files�Ƀt�@�C�����쐬����邱�ƂɂȂ�܂��B �ǂݎ��A�N�Z�X�ł́A�܂�%LocalAppData%VirtualStore\Program Files���m�F���A �ړI�̃t�@�C�������݂��Ȃ��ꍇ��%ProgramFiles%���m�F���܂��B
UAC���L���ɂȂ��Ă���ꍇ�A�v���Z�X�̃g�[�N���̓f�t�H���g�ʼn��z�����L���ɂȂ��Ă��܂����A ����͎��s���ɖ������邱�Ƃ��ł��܂��B �g�[�N���ɂ͉��z����L���Ɏ����l���܂܂�Ă��邽�߁A�����ύX����悢���ƂɂȂ�܂��B �g�[�N���̏���ύX����ɂ́ASetTokenInformation���Ăяo���܂��B
BOOL WINAPI SetTokenInformation( HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength );
TokenHandle�́A�g�[�N���̃n���h�����w�肵�܂��B TokenInformationClass�́A�ݒ肷����̎�ނ�\��TOKEN_INFORMATION_CLASS�^�̒萔���w�肵�܂��B TokenInformation�́A�ݒ肷������i�[�����o�b�t�@���w�肵�܂��B TokenInformationLength�́ATokenInformation�Ɏw�肵���o�b�t�@�̃T�C�Y���w�肵�܂��B
���ɁASetTokenInformation���Ăяo���ĉ��z�����ɂ����������܂��B ���̌��ʁA���z�X�g�A�ւ̃��_�C���N�g���������Ȃ����߁A �t�@�C���ւ̏������݂�쐬�͎��s�ɏI��邱�ƂɂȂ�܂��B
#include <windows.h> int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { HANDLE hToken; HANDLE hFile; DWORD dwEnabled; DWORD dwLength; TOKEN_ELEVATION tokenElevation; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_DEFAULT, &hToken)) { MessageBox(NULL, TEXT("�g�[�N���̃n���h���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING); return 0; } if (!GetTokenInformation(hToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) { MessageBox(NULL, TEXT("���i���̎擾�Ɏ��s���܂����B"), NULL, MB_ICONWARNING); CloseHandle(hToken); return 0; } if (tokenElevation.TokenIsElevated == 0) { dwEnabled = 0; if (!SetTokenInformation(hToken, TokenVirtualizationEnabled, &dwEnabled, sizeof(DWORD))) MessageBox(NULL, TEXT("Virtualization�̖������Ɏ��s���܂����B"), NULL, MB_ICONWARNING); } hFile = CreateFile(TEXT("C:\\Program Files\\sample.txt"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_ACCESS_DENIED) MessageBox(NULL, TEXT("�A�N�Z�X�����ۂ���܂����B"), NULL, MB_ICONWARNING); CloseHandle(hToken); return 0; } MessageBox(NULL, TEXT("�t�@�C�����쐬���܂����B"), TEXT("OK"), MB_OK); CloseHandle(hFile); CloseHandle(hToken); return 0; }
UAC���L���ł���ꍇ�ł��A�Ǘ��҂Ƃ��Ď��s����Ă���ꍇ�͉��z�������ɖ����ɂȂ��Ă��邽�߁A ���̏ꍇ�͖����ɂ��鏈�����s�v�ƂȂ�܂��B ����āATokenElevation��ʂ��ăg�[�N�������i����Ă��邩���m�F����K�v������܂��B ���i����Ă��Ȃ��ꍇ�́A���z�����L���ɂȂ��Ă��邽�߁A TokenVirtualizationEnabled��0�ɐݒ肷�邱�ƂŁA���z�����ɂ��邱�ƂɂȂ�܂��B ����ɂ��ACreateFile�̌Ăяo���͎��s���邱�ƂɂȂ�܂��B �t��SetTokenInformation�̌Ăяo�����ȗ������ꍇ�́A���z�X�g�A�Ƀt�@�C�����쐬����Ă��邱�Ƃ��m�F�ł��܂��B ���R�Ȃ���A�Ǘ��҂Ƃ��Ď��s�����ꍇ�́ACreateFile�Ɏw�肵���p�X�Ƀt�@�C���͍쐬����܂��B �܂��A�Ǘ��҂Ƃ��Ď��s���Ă���g�[�N���ɑ��āA���z����L���ɂ��邱�Ƃ͂ł��܂���B
�V�[���h�A�C�R���Ə��i |
�v���Z�X�𐧌����ꂽ���[�U�[�Ŏ��s���邱�Ƃ͍D�܂����Ƃ����܂����A �ꍇ�ɂ���Ă͊Ǘ��҂Ƃ��ăR�[�h�����s���Ȃ���Ȃ�Ȃ����Ƃ�����܂��B ���̂悤�ȏꍇ�A����ɊǗ��҂Ƃ��Ă̓���ɓ��낤�Ƃ��ẮA���˂ɏ��i�_�C�A���O���\������Ă��܂����߁A ������J�n���邽�߂̃{�^����p�ӂ��A�����ɃV�[���h�A�C�R����\������̂���ʓI�ł��B ����������[�U�[�́A���̃{�^�����������Ƃŏ��i�𑣂��_�C�A���O���\�������Ɨ����ł��܂��B �_�C�A���O���\�������d�g�݂́A�Ǘ��҂łȂ���Ύ��s�ł��Ȃ��������������v���Z�X��p�ӂ��A ������Ӑ}�I�ɏ��i�����Ď��s���邱�ƂŐ������Ă��܂��B �܂�A�{�^���������ꂽ�v���Z�X�����i����̂ł͂Ȃ��A �{�^���������ꂽ�v���Z�X���ʂ̃v���Z�X���N�����Ă���̂ł��B ���ɁA�R�[�h��������܂��B #include <windows.h> #include <commctrl.h> #include <psapi.h> #pragma comment (lib, "psapi.lib") #define ID_BUTTON 100 void EnumProcessName(HWND hwndListBox); BOOL IsTokenElevation(); BOOL EnablePrivilege(LPTSTR lpszPrivilege, BOOL bEnable); LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { TCHAR szAppName[] = TEXT("sample"); HWND hwnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WindowProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hinst; wc.hIcon = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); wc.hCursor = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED); wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; wc.hIconSm = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED); if (RegisterClassEx(&wc) == 0) return 0; hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL); if (hwnd == NULL) return 0; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HWND hwndListBox = NULL; switch (uMsg) { case WM_CREATE: { HWND hwndButton; hwndListBox = CreateWindowEx(0, TEXT("LISTBOX"), NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL, 0, 0, 0, 0, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL); EnumProcessName(hwndListBox); if (!IsTokenElevation()) { hwndButton = CreateWindowEx(0, TEXT("BUTTON"), TEXT("�S�Ẵv���Z�X���"), WS_CHILD | WS_VISIBLE, 30, 20, 200, 30, hwnd, (HMENU)ID_BUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL); SendMessage(hwndButton, BCM_SETSHIELD, 0, TRUE); } return 0; } case WM_COMMAND: if (LOWORD(wParam) == ID_BUTTON) { TCHAR szModulePath[MAX_PATH]; GetModuleFileName(NULL, szModulePath, sizeof(szModulePath) / sizeof(TCHAR)); ShellExecute(NULL, TEXT("runas"), szModulePath, NULL, NULL, SW_SHOWNORMAL); if (GetLastError() == ERROR_SUCCESS) PostMessage(hwnd, WM_CLOSE, 0, 0); } return 0; case WM_SIZE: MoveWindow(hwndListBox, 0, 70, LOWORD(lParam), HIWORD(lParam), TRUE); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: break; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } void EnumProcessName(HWND hwndListBox) { DWORD i, dwCount; DWORD dwProcessId[1024], dwSize; HANDLE hProcess; TCHAR szImageName[MAX_PATH]; EnablePrivilege(SE_DEBUG_NAME, TRUE); EnumProcesses(dwProcessId, sizeof(dwProcessId), &dwSize); dwCount = dwSize / sizeof(DWORD); for (i = 0; i < dwCount; i++) { hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId[i]); if (hProcess != NULL) { dwSize = sizeof(szImageName) / sizeof(TCHAR); QueryFullProcessImageName(hProcess, 0, szImageName, &dwSize); SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)szImageName); CloseHandle(hProcess); } } } BOOL IsTokenElevation() { HANDLE hToken; DWORD dwLength; TOKEN_ELEVATION tokenElevation; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) return FALSE; if (!GetTokenInformation(hToken, TokenElevation, &tokenElevation, sizeof(TOKEN_ELEVATION), &dwLength)) { CloseHandle(hToken); return FALSE; } CloseHandle(hToken); return tokenElevation.TokenIsElevated; } BOOL EnablePrivilege(LPTSTR lpszPrivilege, BOOL bEnable) { BOOL bResult; LUID luid; HANDLE hToken; TOKEN_PRIVILEGES tokenPrivileges; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE; if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) { CloseHandle(hToken); return FALSE; } tokenPrivileges.PrivilegeCount = 1; tokenPrivileges.Privileges[0].Luid = luid; tokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0; bResult = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL); CloseHandle(hToken); return bResult && GetLastError() == ERROR_SUCCESS; } ���̃v���O�����̓v���Z�X����邱�Ƃ��ړI�ł����A �������ꂽ���[�U�[�Ƃ��Ď��s����Ă���ꍇ�́A�S�Ẵv���Z�X��ł��܂���B ���R��SE_DEBUG_NAME�����̗L�����Ɏ��s���邩��ł���A ����ɂ��V�X�e���v���Z�X�ɑ���OpenProcess�����s���邩��ł��B �����ŁA���������V�X�e���v���Z�X���������ꍇ�́A "�S�Ẵv���Z�X���"�Ƃ����{�^�����������܂��B ���̂Ƃ��́A���i���邽�߂̏������s���ׂ��ł��邽�߁A ���i���Ď��s��������EXE�̃t���p�X���K�v�ɂȂ�܂����A ����͎��v���Z�X�̂��̂Ŗ�肠��܂���B �܂�A�����Ɠ����A�v���P�[�V���������i���Ď��s�����A���ꂪ���������ꍇ�Ɏ������g���I��������̂ł��B ���i�����Ď��s���邱�Ƃ�CreateProcess�ł͂ł��܂��A ShellExecute�Ȃ��RunAs�Ƃ�����������w�肷�邱�Ƃʼn\�ł��B ���̏ꍇ�͏��i�̂��߂̃_�C�A���O���\������A ���[�U�[���u���v��I�������ꍇ��ERROR_SUCCESS���Ԃ��ăv���Z�X���N�����A �u�L�����Z���v��I�������ꍇ��ERROR_CANCELLED���Ԃ�܂��B �������ꂽ�v���Z�X���I�����A���i���ꂽ�v���Z�X�����݂�������Ƃ����̂́A�K�������ǂ��I���Ƃ͌���܂���B ���Ƃ��A���郌�W�X�g���L�[�ւ̏������݂��s�����߂ɏ��i���K�v�ɂȂ����Ƃ��܂��B ���̏ꍇ�́A���̏��i���ꂽ�v���Z�X�����W�X�g���ւ̃A�N�Z�X���I������I������悢�����ł���A �������ꂽ�v���Z�X���I������K�v�͂ǂ��ɂ�����܂���B ���i���K�v�ȏ������I�����v���Z�X���A�ˑR�Ƃ��ď��i����Ď��s����邱�Ƃ͊댯�ł���Ƃ����܂�����A ���i���ꂽ�v���Z�X�͉\�Ȍ���f�����I�������ق����悢�ł��傤�B ���ɁA���������܂��B int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow) { TCHAR szKey[] = TEXT("write-registry"); if (lstrcmp(GetCommandLine(), szKey) != 0) { // ���W�X�g���ւ̏������� return 0; } // �A�v���P�[�V�����{���̃R�[�h return 0; } �v���Z�X�������Ɠ����A�v���P�[�V���������i���ċN������ۂɂ́A "write-registry"�Ƃ����p�����[�^���w�肵�A�������g�͏I�����Ȃ��悤�ɂ��܂��B �N�����ꂽ�v���Z�X�̓R�}���h���C�����m�F���A ���ꂪ"write-registry"�Ƃ���������ł���Ȃ�A ���W�X�g���ւ̏������݂��s���ďI�����܂��B ����ɂ��A���i���ꂽ�v���Z�X�͂킸����u�̊Ԃ������݂��Ȃ����ƂɂȂ�܂��B |