Skip to content

Commit

Permalink
Merge pull request #618 from m-tmatma/feature/open-command-prompt-as-…
Browse files Browse the repository at this point in the history
…admin

管理者としてコマンドプロンプトを開くメニュー項目を追加
  • Loading branch information
m-tmatma authored Nov 17, 2018
2 parents 55a4234 + 56ac488 commit 08957b1
Show file tree
Hide file tree
Showing 15 changed files with 126 additions and 4 deletions.
17 changes: 17 additions & 0 deletions help/sakura/_RESOURCE/HLP000377.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<link rel="stylesheet" href="dsk_sakura.css" type="text/css">
<link rel="shortcut icon" href="images/favicon.ico">
<TITLE>管理者としてコマンドプロンプトを開く</TITLE>
<META NAME="MS-HKWD" CONTENT="コマンドプロンプトを開く">
<META NAME="MS-HKWD" CONTENT="OpenCommandPrompt">
</HEAD>
<BODY>
<script type="text/javascript" src="item.js"></script>
<noscript>[<a href="HLP000001.html">目次</a>]<br></noscript>
<h2>管理者としてコマンドプロンプトを開く</h2>
ファイルの場所を管理者としてコマンドプロンプトで開きます。

</BODY></HTML>
5 changes: 5 additions & 0 deletions help/sakura/sakura.hhc
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,11 @@
<param name="Local" value="_RESOURCE\HLP000376.html">
<param name="ImageNumber" value="9">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��">
<param name="Local" value="_RESOURCE\HLP000377.html">
<param name="ImageNumber" value="9">
</OBJECT>
<LI> <OBJECT type="text/sitemap">
<param name="Name" value="�ŋߎg�����t�@�C��">
<param name="Local" value="_RESOURCE\HLP000029.html">
Expand Down
4 changes: 4 additions & 0 deletions help/sakura/sakura.hhk
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,10 @@
<param name="Local" value="_RESOURCE\HLP000376.html">
</OBJECT>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="�Ǘ��҂Ƃ��ăR�}���h�v�����v�g���J��">
<param name="Local" value="_RESOURCE\HLP000377.html">
</OBJECT>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="�ŋߎg�����t�@�C��">
<param name="Local" value="_RESOURCE\HLP000029.html">
</OBJECT>
Expand Down
2 changes: 2 additions & 0 deletions help/sakura/sakura.hhp
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ _RESOURCE\HLP000373.html
_RESOURCE\HLP000374.html
_RESOURCE\HLP000375.html
_RESOURCE\HLP000376.html
_RESOURCE\HLP000377.html
_RESOURCE\HLP_UR000.html
_RESOURCE\HLP_UR017.html
_RESOURCE\HLP_UR016.html
Expand Down Expand Up @@ -776,6 +777,7 @@ HLP000373=_RESOURCE\HLP000373.html
HLP000374=_RESOURCE\HLP000374.html
HLP000375=_RESOURCE\HLP000375.html
HLP000376=_RESOURCE\HLP000376.html
HLP000377=_RESOURCE\HLP000377.html
HLP_UR000=_RESOURCE\HLP_UR000.html
HLP_UR017=_RESOURCE\HLP_UR017.html
HLP_UR016=_RESOURCE\HLP_UR016.html
Expand Down
1 change: 1 addition & 0 deletions sakura_core/Funccode_x.hsrc
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ F_EXITALLEDITORS = 30194, //編集の全終了 なし
F_EXITALL = 30195, //サクラエディタの全終了 なし
F_OPEN_FOLDER_IN_EXPLORER = 30196, //ファイルの場所を開く
F_OPEN_COMMAND_PROMPT = 30197, //コマンドプロンプトを開く
F_OPEN_COMMAND_PROMPT_AS_ADMIN = 30198, //管理者としてコマンドプロンプトを開く

// 編集系
F_WCHAR = 30200, //文字入力 WCHAR c
Expand Down
3 changes: 2 additions & 1 deletion sakura_core/cmd/CViewCommander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,8 @@ BOOL CViewCommander::HandleCommand(
case F_VIEWMODE: Command_VIEWMODE();break; /* ビューモード */
case F_PROPERTY_FILE: Command_PROPERTY_FILE();break; /* ファイルのプロパティ */
case F_OPEN_FOLDER_IN_EXPLORER: Command_OPEN_FOLDER_IN_EXPLORER();break; /* ファイルの場所を開く */
case F_OPEN_COMMAND_PROMPT: Command_OPEN_COMMAND_PROMPT();break; /* コマンドプロンプトを開く */
case F_OPEN_COMMAND_PROMPT: Command_OPEN_COMMAND_PROMPT(FALSE);break; /* コマンドプロンプトを開く */
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: Command_OPEN_COMMAND_PROMPT(TRUE);break; /* 管理者としてコマンドプロンプトを開く */
case F_PROFILEMGR: Command_PROFILEMGR();break; // プロファイルマネージャ
case F_EXITALLEDITORS: Command_EXITALLEDITORS();break; /* 編集の全終了 */ // 2007.02.13 ryoji 追加
case F_EXITALL: Command_EXITALL();break; /* サクラエディタの全終了 */ //Dec. 26, 2000 JEPRO 追加
Expand Down
2 changes: 1 addition & 1 deletion sakura_core/cmd/CViewCommander.h
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ class CViewCommander{
void Command_VIEWMODE( void ); /* ビューモード */
void Command_PROPERTY_FILE( void ); /* ファイルのプロパティ */
void Command_OPEN_FOLDER_IN_EXPLORER( void ); /* ファイルの場所を開く */
void Command_OPEN_COMMAND_PROMPT( void ); /* コマンドプロンプトを開く */
void Command_OPEN_COMMAND_PROMPT( BOOL isAdmin ); /* コマンドプロンプトを開く */
void Command_PROFILEMGR( void ); // プロファイルマネージャ
void Command_EXITALLEDITORS( void ); /* 編集の全終了 */ // 2007.02.13 ryoji 追加
void Command_EXITALL( void ); /* サクラエディタの全終了 */ //Dec. 27, 2000 JEPRO 追加
Expand Down
21 changes: 19 additions & 2 deletions sakura_core/cmd/CViewCommander_File.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
#include "plugin/CJackManager.h"
#include "env/CSakuraEnvironment.h"
#include "debug/CRunningTimer.h"
#include "util/os.h"
#include "sakura_rc.h"


Expand Down Expand Up @@ -605,7 +606,7 @@ void CViewCommander::Command_OPEN_FOLDER_IN_EXPLORER(void)


/* コマンドプロンプトを開く */
void CViewCommander::Command_OPEN_COMMAND_PROMPT(void)
void CViewCommander::Command_OPEN_COMMAND_PROMPT(BOOL isAdmin)
{
if (!GetDocument()->m_cDocFile.GetFilePathClass().IsValidPath()) {
ErrorBeep();
Expand Down Expand Up @@ -640,7 +641,23 @@ void CViewCommander::Command_OPEN_COMMAND_PROMPT(void)
return;
}

auto hInstance = ::ShellExecuteW(NULL, L"open", szCmdExePathBuf, pszcmdExeParam, strFolder.c_str(), SW_SHOWNORMAL);
LPWSTR pVerb = L"open";
if (isAdmin)
{
pVerb = L"runas";
}

#ifndef _WIN64
/*
64bit OS で 32bit アプリから管理者権限でコマンドプロンプトを起動する場合
通常は 32bit 版のコマンドプロンプトが開かれる。
Wow64 の FileSystem Redirection を一時的にオフにすることにより 64bit 版の
コマンドプロンプトを起動する
*/
CDisableWow64FsRedirect wow64Redirect(isAdmin);
#endif
auto hInstance = ::ShellExecuteW(NULL, pVerb, szCmdExePathBuf, pszcmdExeParam, strFolder.c_str(), SW_SHOWNORMAL);
// If the function succeeds, it returns a value greater than 32.
if (hInstance <= (decltype(hInstance))32) {
ErrorBeep();
Expand Down
6 changes: 6 additions & 0 deletions sakura_core/env/CShareData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1386,6 +1386,9 @@ void CShareData::InitPopupMenu(DLLSHAREDATA* pShareData)
rMenu.m_nCustMenuItemFuncArr[0][n] = F_OPEN_COMMAND_PROMPT;
rMenu.m_nCustMenuItemKeyArr[0][n] = 'W';
n++;
rMenu.m_nCustMenuItemFuncArr[0][n] = F_OPEN_COMMAND_PROMPT_AS_ADMIN;
rMenu.m_nCustMenuItemKeyArr[0][n] = 'w';
n++;
rMenu.m_nCustMenuItemFuncArr[0][n] = F_PROPERTY_FILE;
rMenu.m_nCustMenuItemKeyArr [0][n] = 'F'; //Nov. 9, 2000 JEPRO 「やり直し」とバッティングしていたアクセスキーを変更(R→F)
n++;
Expand Down Expand Up @@ -1437,6 +1440,9 @@ void CShareData::InitPopupMenu(DLLSHAREDATA* pShareData)
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_OPEN_COMMAND_PROMPT;
rMenu.m_nCustMenuItemKeyArr[CUSTMENU_INDEX_FOR_TABWND][n] = 'W';
n++;
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_OPEN_COMMAND_PROMPT_AS_ADMIN;
rMenu.m_nCustMenuItemKeyArr[CUSTMENU_INDEX_FOR_TABWND][n] = 'w';
n++;
rMenu.m_nCustMenuItemFuncArr[CUSTMENU_INDEX_FOR_TABWND][n] = F_0;
rMenu.m_nCustMenuItemKeyArr [CUSTMENU_INDEX_FOR_TABWND][n] = '\0';
n++;
Expand Down
3 changes: 3 additions & 0 deletions sakura_core/func/Funccode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ const EFunctionCode pnFuncList_File[] = { //Oct. 16, 2000 JEPRO 変数名変更(
F_PROPERTY_FILE , /* ファイルのプロパティ */
F_OPEN_FOLDER_IN_EXPLORER , //ファイルの場所を開く
F_OPEN_COMMAND_PROMPT , //コマンドプロンプトを開く
F_OPEN_COMMAND_PROMPT_AS_ADMIN , //管理者としてコマンドプロンプトを開く
F_PROFILEMGR , //プロファイルマネージャ
F_EXITALLEDITORS , //編集の全終了 // 2007.02.13 ryoji F_WIN_CLOSEALL→F_EXITALLEDITORS
F_EXITALL //サクラエディタの全終了 //Dec. 27, 2000 JEPRO 追加
Expand Down Expand Up @@ -625,6 +626,7 @@ int FuncID_To_HelpContextID( EFunctionCode nFuncID )
case F_PROPERTY_FILE: return HLP000022; /* ファイルのプロパティ */
case F_OPEN_FOLDER_IN_EXPLORER: return HLP000373; //ファイルの場所を開く
case F_OPEN_COMMAND_PROMPT: return HLP000376; //コマンドプロンプトを開く
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: return HLP000377; //管理者としてコマンドプロンプトを開く
case F_PROFILEMGR: return HLP000363; //プロファイルマネージャ

case F_EXITALLEDITORS: return HLP000030; //編集の全終了 // 2007.02.13 ryoji 追加
Expand Down Expand Up @@ -1216,6 +1218,7 @@ bool IsFuncEnable( const CEditDoc* pcEditDoc, const DLLSHAREDATA* pShareData, EF
return pcEditDoc->m_cDocFile.GetFilePathClass().IsValidPath(); // 現在編集中のファイルのパス名をクリップボードにコピーできるか

case F_OPEN_COMMAND_PROMPT: //コマンドプロンプトを開く
case F_OPEN_COMMAND_PROMPT_AS_ADMIN: //管理者としてコマンドプロンプトを開く
if (!pcEditDoc->m_cDocFile.GetFilePathClass().IsValidPath())
{
return false;
Expand Down
1 change: 1 addition & 0 deletions sakura_core/sakura.hh
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
#define HLP000022 22 //ファイルのプロパティ
#define HLP000373 373 //ファイルの場所を開く
#define HLP000376 376 //コマンドプロンプトを開く
#define HLP000377 377 //管理者としてコマンドプロンプトを開く
#define HLP000363 363 //プロファイルマネージャ
#define HLP000029 29 //最近使ったファイル
#define HLP000023 23 //最近使ったフォルダ
Expand Down
1 change: 1 addition & 0 deletions sakura_core/sakura_rc.rc
Original file line number Diff line number Diff line change
Expand Up @@ -2264,6 +2264,7 @@ BEGIN
F_PROFILEMGR "プロファイルマネージャ"
F_OPEN_FOLDER_IN_EXPLORER "ファイルの場所を開く"
F_OPEN_COMMAND_PROMPT "コマンドプロンプトを開く"
F_OPEN_COMMAND_PROMPT_AS_ADMIN "管理者としてコマンドプロンプトを開く"
END

STRINGTABLE DISCARDABLE
Expand Down
31 changes: 31 additions & 0 deletions sakura_core/util/os.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,20 @@ BOOL CheckSystemResources( const TCHAR* pszAppName )
#endif // (WINVER < _WIN32_WINNT_WIN2K)


/*
https://docs.microsoft.com/en-us/windows/desktop/api/wow64apiset/nf-wow64apiset-iswow64process
*/
BOOL IsWow64()
{
BOOL bIsWow64 = FALSE;
if (!IsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// 失敗したら WOW64 はオフとみなす
bIsWow64 = FALSE;
}
return bIsWow64;
}

// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
// 便利クラス //
// -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //
Expand All @@ -409,4 +423,21 @@ CCurrentDirectoryBackupPoint::~CCurrentDirectoryBackupPoint()
}


CDisableWow64FsRedirect::CDisableWow64FsRedirect(BOOL isOn)
: m_isSuccess(FALSE)
, m_OldValue(NULL)
{
if (isOn && IsWow64()) {
m_isSuccess = Wow64DisableWow64FsRedirection(&m_OldValue);
}
else {
m_isSuccess = FALSE;
}
}

CDisableWow64FsRedirect::~CDisableWow64FsRedirect()
{
if (m_isSuccess) {
Wow64RevertWow64FsRedirection(m_OldValue);
}
}
32 changes: 32 additions & 0 deletions sakura_core/util/os.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,38 @@ BOOL IsVisualStyle(); // 自分が現在ビジュアルスタイル表示
void PreventVisualStyle( HWND hWnd ); // 指定ウィンドウでビジュアルスタイルを使わないようにする // 2006.06.23 ryoji
void MyInitCommonControls(); // コモンコントロールを初期化する // 2006.06.21 ryoji

/* Wow64 のエミュレーション上で実行しているか判定する */
BOOL IsWow64();

/*!
@brief Wow64 の ファイルシステムリダイレクションを一時的に無効にして、クラス破棄時に元に戻すクラス
@note このクラスを継承しないように final をつける
*/
class CDisableWow64FsRedirect final {
public:
/*!
@brief コンストラクタで ファイルシステムリダイレクションを無効にする
@param isOn この引数が TRUE のときに無効化処理を行う
*/
CDisableWow64FsRedirect(BOOL isOn);

/*!
@brief ファイルシステムリダイレクションを元に戻す
*/
~CDisableWow64FsRedirect();

// コピー不可 (C++11 で利用可能)
CDisableWow64FsRedirect(const CDisableWow64FsRedirect&) = delete;
CDisableWow64FsRedirect& operator = (const CDisableWow64FsRedirect&) = delete;

// ムーブ不可 (C++11 で利用可能)
CDisableWow64FsRedirect(CDisableWow64FsRedirect&&) = delete;
CDisableWow64FsRedirect& operator = (CDisableWow64FsRedirect&&) = delete;

private:
BOOL m_isSuccess;
PVOID m_OldValue;
};

//カレントディレクトリユーティリティ。
//コンストラクタでカレントディレクトリを保存し、デストラクタでカレントディレクトリを復元するモノ。
Expand Down
1 change: 1 addition & 0 deletions sakura_lang_en_US/sakura_lang_rc.rc
Original file line number Diff line number Diff line change
Expand Up @@ -2269,6 +2269,7 @@ BEGIN
F_PROFILEMGR "Profile Maneger"
F_OPEN_FOLDER_IN_EXPLORER "Open Containing Folder"
F_OPEN_COMMAND_PROMPT "Open Command Propmt"
F_OPEN_COMMAND_PROMPT_AS_ADMIN "Open Command Propmt As Admin"
END

STRINGTABLE DISCARDABLE
Expand Down

0 comments on commit 08957b1

Please sign in to comment.