- 2013-7-4
- Visual C++
昔のソース。
プロセスの実行ユーザの権限不足で、
コピー等の処理できない場合に、
権限の有るユーザでログオン(偽装ログオン)し処理を実行するようにする。
実際、要件によるからあんまり使わないと思うけども。。
昔のソースだけに実際動くんだろうか?
void CCpFlDlg::OnBnClickedOk() { CString strDcn; CString strUser; CString strPws; CString strPath; CString strPath2; CString strTemp; HANDLE hToken = NULL; BOOL bRet = TRUE; int bErr = 0; m_edtDcn.GetWindowTextA ( strDcn ); m_edtUser.GetWindowTextA( strUser ); m_edtPws.GetWindowTextA ( strPws ); m_edtPath.GetWindowTextA( strPath ); m_edtPath2.GetWindowTextA( strPath2 ); // 別のユーザでログオン if( ::LogonUserA( ( LPTSTR )strUser.GetString(), ( LPTSTR )strDcn.GetString(), ( LPTSTR )strPws.GetString(), //LOGON32_LOGON_NETWORK, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken ) == FALSE ) { // ログオンに失敗 bErr = ::GetLastError(); if( bErr == ERROR_LOGON_FAILURE ) { MessageBox( "ERROR_LOGON_FAILURE" ); } else if( bErr == ERROR_ACCOUNT_RESTRICTION ) { MessageBox( "ERROR_ACCOUNT_RESTRICTION" ); } else if( bErr == ERROR_LOGON_TYPE_NOT_GRANTED ) { MessageBox( "ERROR_LOGON_TYPE_NOT_GRANTED" ); } else if( bErr == ERROR_ACCOUNT_DISABLED ) { MessageBox( "ERROR_ACCOUNT_DISABLED" ); } else { strTemp.Format( "その他ログオン失敗 [ %d ]", bErr ); MessageBox( strTemp ); } return; } MessageBox( "偽装ログオン成功" ); // 偽装トークンでスレッドの権限をログオンユーザ権限に偽装 if( ImpersonateLoggedOnUser( hToken ) == FALSE ) { bErr = ::GetLastError(); strTemp.Format( "スレッド偽装に失敗 [ %d ]", bErr ); MessageBox( strTemp ); ::CloseHandle(hToken); return; } MessageBox( "スレッド偽装成功" ); // 対象権限でしか動かない処理(例えばコピー) if( ::CopyFile( ( LPCSTR )strPath.GetString(), ( LPCSTR )strPath2.GetString(), FALSE ) == FALSE ) { bErr = ::GetLastError(); strTemp.Format( "コピー失敗 [ %d ]", bErr ); MessageBox( strTemp ); } // スレッド偽装の終了 RevertToSelf(); // トークンハンドルクローズ ::CloseHandle( hToken ); }