権限に関係なくProgram Filesのファイルへアクセスをできるようにするには
Program Filesのファイルは、2000/XPでも管理者権限を持たないアカウントでは、ファイルの書き込みや作成を行うことができません。
Vistaでは、Administratorsグループに所属していても、管理者権限へ権限上昇しなければProgram Filesへのファイルの書き込みや作成をすることができません。
現在のWindowsアカウント用のVirtualStoreフォルダにエミュレートされて保存されてしまいます。
あまり綺麗な方法とはいいづらいのですが、インストールしたパス以下すべてにEveryone権限を付加すれば、どのユーザーでもファイルの書き込みや作成を行うことができるようになります。これは以外に簡単に行うことができます。
コマンドラインで以下のように記載しますと、C:\Program Files\Sampleフォルダ以下にEveryone権限が付与されます。
■ C:\Program Files\Sampleフォルダ以下をEveryone権限にする
C:\> cmd.exe /c cacls "C:\Program Files\Sample" /T /E /G Everyone:F
|
これで、どんな権限のユーザーでもファイルを操作できるようになり、VirtualStoreに保存されるのを避けることができます。
サンプルは下記になります。
※ C++であればACLを直接操作した方が正しい方法かもしれませんが。
■■■ everyone プロジェクト
■ everyone.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="everyone"
type="win32"/>
<description>Privilege's elevation for Everyone</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly> |
■ everyone.exe.manifest
1 24 "everyone.exe.manifest" |
■ main.cpp
//----------------------------------------------------------------------------------------------------
// 特定ディレクトリ以下に、Everyone権限付与
// 通常はACLを操作しますが、ラクしています XP/Vistaでテスト済み
//----------------------------------------------------------------------------------------------------
#pragma warning ( disable : 4786 )
#include <windows.h>
#include <tchar.h>
#include <string>
// 指定フォルダ以下にeveryone権限を付加
BOOL AddEveryoneToDirectories ( const _TCHAR *pszDir )
{
PROCESS_INFORMATION pi;
memset ( &pi, 0, sizeof ( PROCESS_INFORMATION ) );
DWORD dwStartupInfoSize;
dwStartupInfoSize = sizeof ( STARTUPINFO );
STARTUPINFO si;
memset ( &si, 0, dwStartupInfoSize );
si.cb = dwStartupInfoSize;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
enum
{
MAX_MAX_PATH = 2048
};
_TCHAR szWindowsDir[ MAX_MAX_PATH ];
GetSystemWindowsDirectory ( szWindowsDir, MAX_MAX_PATH );
std::basic_string < _TCHAR > strCmdPath ( szWindowsDir );
strCmdPath += _TEXT ( "\\System32\\Cmd.exe" );
std::basic_string < _TCHAR > strCommand;
strCommand = _TEXT ( "/c cacls \"" );
strCommand += pszDir;
strCommand += _TEXT ( "\" /T /E /G Everyone:F" );
std::basic_string < _TCHAR > strCmdDir ( szWindowsDir );
strCmdDir += _TEXT ( "\\System32" );
if ( CreateProcess ( strCmdPath.c_str (),
const_cast < _TCHAR * > ( strCommand.c_str () ),
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS,
NULL,
strCmdDir.c_str (),
&si,
&pi ) )
{
WaitForSingleObject ( pi.hProcess, INFINITE );
CloseHandle ( pi.hThread );
CloseHandle ( pi.hProcess );
return TRUE;
}
return FALSE;
}
// エントリポイント
int WINAPI _tWinMain ( HINSTANCE,
HINSTANCE,
_TCHAR *,
int )
{
AddEveryoneToDirectories ( _TEXT ( "C:\\Program Files\\Sample" ) );
return 0;
}
|
|