Parcourir la source

elevated to uac privleges

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@687 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden il y a 11 ans
Parent
commit
475138b0aa
15 fichiers modifiés avec 170 ajouts et 22 suppressions
  1. 1 0
      ActionEnums.h
  2. 2 2
      CP_Main.cpp
  3. 1 1
      CP_Main.h
  4. 14 11
      CP_Main.rc
  5. 16 3
      ExternalWindowTracker.cpp
  6. 1 1
      Options.cpp
  7. 4 1
      OptionsQuickPaste.cpp
  8. 1 0
      OptionsQuickPaste.h
  9. 19 0
      QPasteWnd.cpp
  10. 2 0
      QPasteWnd.h
  11. 4 1
      Resource.h
  12. 87 0
      UAC_Helper.cpp
  13. 6 0
      UAC_Helper.h
  14. 11 1
      UAC_Thread.cpp
  15. 1 1
      UAC_Thread.h

+ 1 - 0
ActionEnums.h

@@ -33,6 +33,7 @@ public:
 		CLIP_PROPERTIES,
 		PASTE_SELECTED_PLAIN_TEXT,
 		MOVE_CLIP_TO_GROUP,
+		ELEVATE_PRIVlEGES,
 	};
 };
 

+ 2 - 2
CP_Main.cpp

@@ -1030,14 +1030,14 @@ CQPasteWnd* CCP_MainApp::QPasteWnd()
 	return NULL;
 }
 
-void CCP_MainApp::UACPaste()
+bool CCP_MainApp::UACPaste()
 {
 	if(m_pUacPasteThread == NULL)
 	{
 		m_pUacPasteThread = new CUAC_Thread(GetCurrentProcessId());
 	}
 
-	m_pUacPasteThread->UACPaste();
+	return m_pUacPasteThread->UACPaste();
 }
 
 bool CCP_MainApp::UACThreadRunning()

+ 1 - 1
CP_Main.h

@@ -173,7 +173,7 @@ public:
 	CDPI m_metrics;
 	ULONG_PTR m_gdiplusToken;
 
-	void UACPaste();
+	bool UACPaste();
 	bool UACThreadRunning();
 
 public:

+ 14 - 11
CP_Main.rc

@@ -254,6 +254,7 @@ BEGIN
             MENUITEM "Ensure Entire Window Is Visible", 32849,MFT_STRING,MFS_ENABLED
             MENUITEM "Show Clips That are in Groups in Main List", 32850,MFT_STRING,MFS_ENABLED
             MENUITEM "Prompt to Delete Clip",       32852,MFT_STRING,MFS_ENABLED
+            MENUITEM "Elevated privileges to paste into elevated apps", ID_QUICKOPTIONS_ELEVATEPREVILEGESTOPASTEINTOELEVATEDAPPS,MFT_STRING,MFS_ENABLED
         END
         POPUP "Send To",                        65535,MFT_STRING,MFS_ENABLED
         BEGIN
@@ -412,20 +413,22 @@ BEGIN
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,108,335,10
     CONTROL         "Prompt when deleting clips",IDC_CHECK_PROMPT_DELETE_CLIP,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,118,335,10
-    COMBOBOX        IDC_COMBO_THEME,59,142,130,95,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
-    PUSHBUTTON      "About Theme",IDC_BUTTON_THEME,198,142,106,12
-    PUSHBUTTON      "Font",IDC_BUTTON_FONT,18,160,143,17
-    PUSHBUTTON      "Default Font",IDC_BUTTON_DEFAULT_FAULT,164,163,70,12
-    CONTROL         "At Caret",IDC_AT_CARET,"Button",BS_AUTORADIOBUTTON,22,195,93,10
-    CONTROL         "At Cursor",IDC_AT_CURSOR,"Button",BS_AUTORADIOBUTTON,22,205,97,10
-    CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",BS_AUTORADIOBUTTON,22,215,117,10
+    COMBOBOX        IDC_COMBO_THEME,59,152,130,95,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
+    PUSHBUTTON      "About Theme",IDC_BUTTON_THEME,198,152,106,12
+    PUSHBUTTON      "Font",IDC_BUTTON_FONT,18,170,143,17
+    PUSHBUTTON      "Default Font",IDC_BUTTON_DEFAULT_FAULT,164,173,70,12
+    CONTROL         "At Caret",IDC_AT_CARET,"Button",BS_AUTORADIOBUTTON,22,205,93,10
+    CONTROL         "At Cursor",IDC_AT_CURSOR,"Button",BS_AUTORADIOBUTTON,22,215,97,10
+    CONTROL         "At Previous Position",IDC_AT_PREVIOUS,"Button",BS_AUTORADIOBUTTON,22,225,117,10
     LTEXT           "%",IDC_STATIC,199,55,8,12,SS_CENTERIMAGE
-    GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,10,186,138,41
-    LTEXT           "  * = Don't Auto Delete\n  s = Shortcut exists\n G = Item is a Group\n  ! = Item is attached to a Group",IDC_STATIC_LEG,158,196,154,36
-    GROUPBOX        "List Item Prefix Legend",IDC_STATIC_LEGEND,153,186,165,50
-    LTEXT           "Theme",IDC_STATIC_THEME,18,142,36,12,SS_CENTERIMAGE
+    GROUPBOX        "Popup Positioning",IDC_STATIC_POPUP,10,196,138,41
+    LTEXT           "  * = Don't Auto Delete\n  s = Shortcut exists\n G = Item is a Group\n  ! = Item is attached to a Group",IDC_STATIC_LEG,158,206,154,36
+    GROUPBOX        "List Item Prefix Legend",IDC_STATIC_LEGEND,153,196,165,50
+    LTEXT           "Theme",IDC_STATIC_THEME,18,152,36,12,SS_CENTERIMAGE
     CONTROL         "Always Show Scroll Bar",IDC_CHECK_SHOW_SCROLL_BAR,
                     "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,128,335,10
+    CONTROL         "Elevated privileges to paste into elevated apps",IDC_CHECK_ELEVATE_PRIVILEGES,
+                    "Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,139,335,10
 END
 
 IDD_OPTIONS_KEYSTROKES DIALOGEX 0, 0, 350, 206

+ 16 - 3
ExternalWindowTracker.cpp

@@ -4,6 +4,7 @@
 #include "SendKeys.h"
 #include "Options.h"
 #include "CP_Main.h"
+#include "UAC_Helper.h"
 
 ExternalWindowTracker::ExternalWindowTracker(void)
 {
@@ -245,13 +246,25 @@ void ExternalWindowTracker::SendPaste(bool activateTarget)
 	m_dittoHasFocus = false;
 	Log(StrF(_T("Sending paste to app %s key stroke: %s, SeDelay: %d"), csPasteToApp, csPasteString, delay));
 
-	if(g_Opt.GetPasteAsAdmin() &&
+	bool pasteAsAdmin = false;
+
+	if (activateTarget &&
+		g_Opt.GetPasteAsAdmin())
+	{
+		pasteAsAdmin = CUAC_Helper::PasteAsAdmin(activeWnd);
+	}
+
+	if(pasteAsAdmin &&
 		theApp.UACThreadRunning() == false)
 	{
 		Log(StrF(_T("Passing paste off to uac aware app")));
-		theApp.UACPaste();
+		if (theApp.UACPaste() == false)
+		{
+			pasteAsAdmin = false;
+		}
 	}
-	else
+	
+	if (pasteAsAdmin == false)
 	{
 		Sleep(delay);
 		send.SetKeyDownDelay(max(50, delay));

+ 1 - 1
Options.cpp

@@ -2074,5 +2074,5 @@ void CGetSetOptions::SetPasteAsAdmin(BOOL val)
 
 BOOL CGetSetOptions::GetPasteAsAdmin()
 {
-	return GetProfileLong(_T("PasteAsAdmin"), 0);
+	return GetProfileLong(_T("PasteAsAdmin"), 1);
 }

+ 4 - 1
OptionsQuickPaste.cpp

@@ -58,6 +58,7 @@ void COptionsQuickPaste::DoDataExchange(CDataExchange* pDX)
 	DDX_Control(pDX, IDC_CHECK_PROMPT_DELETE_CLIP, m_PromptForDelete);
 	DDX_Control(pDX, IDC_COMBO_THEME, m_cbTheme);
 	DDX_Control(pDX, IDC_CHECK_SHOW_SCROLL_BAR, m_alwaysShowScrollBar);
+	DDX_Control(pDX, IDC_CHECK_ELEVATE_PRIVILEGES, m_elevatedPrivileges);
 }
 
 
@@ -101,6 +102,7 @@ BOOL COptionsQuickPaste::OnInitDialog()
 
 	m_btShowText.SetCheck(CGetSetOptions::GetShowTextForFirstTenHotKeys());
 	m_PromptForDelete.SetCheck(CGetSetOptions::GetPromptWhenDeletingClips());
+	m_elevatedPrivileges.SetCheck(CGetSetOptions::GetPasteAsAdmin());
 
 	if(CGetSetOptions::GetFont(m_LogFont))
 	{		
@@ -138,7 +140,7 @@ BOOL COptionsQuickPaste::OnApply()
 	else if(IsDlgButtonChecked(IDC_AT_PREVIOUS))
 		CGetSetOptions::SetQuickPastePosition(POS_AT_PREVIOUS);
 
-	g_Opt.SetDescShowLeadingWhiteSpace( m_btDescShowLeadingWhiteSpace.GetCheck() );
+	g_Opt.SetDescShowLeadingWhiteSpace(m_btDescShowLeadingWhiteSpace.GetCheck());
 	CGetSetOptions::SetUseCtrlNumForFirstTenHotKeys(m_btUseCtrlNum.GetCheck());
 	CGetSetOptions::SetShowTextForFirstTenHotKeys(m_btShowText.GetCheck());
 	CGetSetOptions::SetDrawThumbnail(m_btShowThumbnails.GetCheck());
@@ -147,6 +149,7 @@ BOOL COptionsQuickPaste::OnApply()
 	CGetSetOptions::SetShowAllClipsInMainList(m_ShowAllInMainList.GetCheck());
 	CGetSetOptions::SetFindAsYouType(m_FindAsYouType.GetCheck());
 	CGetSetOptions::SetPromptWhenDeletingClips(m_PromptForDelete.GetCheck());
+	CGetSetOptions::SetPasteAsAdmin(m_elevatedPrivileges.GetCheck());
 	
 	if(m_LogFont.lfWeight != 0)
 	{

+ 1 - 0
OptionsQuickPaste.h

@@ -71,6 +71,7 @@ protected:
 
 public:
 	CButton m_PromptForDelete;
+	CButton m_elevatedPrivileges;
 	CComboBox m_cbTheme;
 	afx_msg void OnBnClickedButtonTheme();
 	CButton m_alwaysShowScrollBar;

+ 19 - 0
QPasteWnd.cpp

@@ -152,6 +152,7 @@ ON_COMMAND(ID_QUICKOPTIONS_PROMPTTODELETECLIP, OnPromptToDeleteClip)
 ON_COMMAND(ID_STICKYCLIPS_MAKETOPSTICKYCLIP, OnMakeTopStickyClip)
 ON_COMMAND(ID_STICKYCLIPS_MAKELASTSTICKYCLIP, OnMakeLastStickyClip)
 ON_COMMAND(ID_STICKYCLIPS_REMOVESTICKYSETTING, OnRemoveStickySetting)
+ON_COMMAND(ID_QUICKOPTIONS_ELEVATEPREVILEGESTOPASTEINTOELEVATEDAPPS, OnElevateAppToPasteIntoElevatedApp)
 
 ON_WM_DESTROY()
 
@@ -1435,6 +1436,11 @@ void CQPasteWnd::SetMenuChecks(CMenu *pMenu)
     }
 
     pMenu->DeleteMenu(ID_MENU_SENTTO_PROMPTFORIP, MF_BYCOMMAND);
+
+	if (g_Opt.GetPasteAsAdmin())
+	{
+		pMenu->CheckMenuItem(ID_QUICKOPTIONS_ELEVATEPREVILEGESTOPASTEINTOELEVATEDAPPS, MF_CHECKED);
+	}
 }
 
 void CQPasteWnd::SetSendToMenu(CMenu *pMenu, int nMenuID, int nArrayPos)
@@ -2127,6 +2133,11 @@ void CQPasteWnd::OnRemoveStickySetting()
 	}
 }
 
+void CQPasteWnd::OnElevateAppToPasteIntoElevatedApp()
+{
+	this->DoAction(ActionEnums::ELEVATE_PRIVlEGES);
+}
+
 void CQPasteWnd::OnMenuExport()
 {
     CClipIDs IDs;
@@ -2600,6 +2611,8 @@ bool CQPasteWnd::DoAction(DWORD actionId)
 	case ActionEnums::MOVE_CLIP_TO_GROUP:
 		ret = DoActionMoveClipToGroup();
 		break;
+	case ActionEnums::ELEVATE_PRIVlEGES:
+		ret = DoActionElevatePrivleges();
 
 	}
 
@@ -3082,6 +3095,12 @@ bool CQPasteWnd::DoActionMoveClipToGroup()
 	return false;
 }
 
+bool CQPasteWnd::DoActionElevatePrivleges()
+{
+	g_Opt.SetPasteAsAdmin(!g_Opt.GetPasteAsAdmin());
+
+	return true;
+}
 LRESULT CQPasteWnd::OnCancelFilter(WPARAM wParam, LPARAM lParam)
 {
 	this->DoAction(ActionEnums::CANCELFILTER);

+ 2 - 0
QPasteWnd.h

@@ -231,6 +231,7 @@ public:
 	bool DoActionClipProperties();
 	bool DoActionPasteSelectedPlainText();
 	bool DoActionMoveClipToGroup();
+	bool DoActionElevatePrivleges();
 
     // Generated message map functions
 protected:
@@ -367,5 +368,6 @@ protected:
 	afx_msg void OnMakeTopStickyClip();
 	afx_msg void OnMakeLastStickyClip();
 	afx_msg void OnRemoveStickySetting();
+	afx_msg void OnElevateAppToPasteIntoElevatedApp();
 	
 };

+ 4 - 1
Resource.h

@@ -226,6 +226,8 @@
 #define IDC_CHECK_SHOW_SCROLL_BAR       2040
 #define IDC_CHECK_WIN10                 2041
 #define IDC_STATIC_MOVE_TO_GROUP        2041
+#define IDC_CHECK_SHOW_SCROLL_BAR2      2041
+#define IDC_CHECK_ELEVATE_PRIVILEGES    2041
 #define IDC_CHECK_WIN1                  2042
 #define IDC_STATIC_TITLE                2042
 #define IDC_CHECK_WIN2                  2043
@@ -415,6 +417,7 @@
 #define ID_STICKYCLIPS_MAKETOPSTICKYCLIP 32878
 #define ID_STICKYCLIPS_MAKELASTSTICKYCLIP 32879
 #define ID_STICKYCLIPS_REMOVESTICKYSETTING 32880
+#define ID_QUICKOPTIONS_ELEVATEPREVILEGESTOPASTEINTOELEVATEDAPPS 32881
 
 // Next default values for new objects
 // 
@@ -422,7 +425,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_3D_CONTROLS                     1
 #define _APS_NEXT_RESOURCE_VALUE        222
-#define _APS_NEXT_COMMAND_VALUE         32881
+#define _APS_NEXT_COMMAND_VALUE         32882
 #define _APS_NEXT_CONTROL_VALUE         2101
 #define _APS_NEXT_SYMED_VALUE           101
 #endif

+ 87 - 0
UAC_Helper.cpp

@@ -1,5 +1,6 @@
 #include "stdafx.h"
 #include "UAC_Helper.h"
+#include "Misc.h"
 
 
 CUAC_Helper::CUAC_Helper(void)
@@ -10,3 +11,89 @@ CUAC_Helper::CUAC_Helper(void)
 CUAC_Helper::~CUAC_Helper(void)
 {
 }
+
+bool CUAC_Helper::PasteAsAdmin(HWND hWnd)
+{
+	bool runningElevated = AmIRunningElevated();
+	bool theirRunningElevated = AreTheyRunningElevated(hWnd);
+
+	bool pasteAsAdmin = false;
+
+	if (runningElevated == false &&
+		theirRunningElevated)
+	{
+		pasteAsAdmin = true;
+	}
+
+	Log(StrF(_T("I'm running elevated: %d, They are running elevated: %d, PASTE AS ADMIN: %d"), runningElevated, theirRunningElevated, pasteAsAdmin));
+
+	return pasteAsAdmin;
+}
+
+bool CUAC_Helper::AmIRunningElevated()
+{
+	bool ret = RunningElevated(GetCurrentProcess(), true);
+
+	return ret;
+}
+
+bool CUAC_Helper::AreTheyRunningElevated(HWND hWnd)
+{
+	DWORD pid;
+	GetWindowThreadProcessId(hWnd, &pid);
+
+	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid);
+
+	bool ret = RunningElevated(hProcess, true);
+
+	return ret;
+}
+
+bool CUAC_Helper::RunningElevated(HANDLE hProcess, bool defaultValue)
+{
+	bool fIsElevated = defaultValue;
+	DWORD dwError = ERROR_SUCCESS;
+	HANDLE hToken = NULL;
+	TOKEN_ELEVATION elevation;
+
+	if (hProcess == NULL)
+	{
+		dwError = GetLastError();
+
+		Log(StrF(_T("RunningElevated, initial Handle is NULL, Last Error: %d"), dwError));
+	}
+	else
+	{
+		if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken))
+		{
+			dwError = GetLastError();
+
+			Log(StrF(_T("RunningElevated, OpenProcessToken failed, Last Error: %d"), dwError));
+		}
+		else
+		{			
+			DWORD dwSize;
+			if (!GetTokenInformation(hToken, TokenElevation, &elevation, sizeof(elevation), &dwSize))
+			{
+				// When the process is run on operating systems prior to Windows 
+				// Vista, GetTokenInformation returns FALSE with the 
+				// ERROR_INVALID_PARAMETER error code because TokenElevation is 
+				// not supported on those operating systems.
+				dwError = GetLastError();
+
+				Log(StrF(_T("RunningElevated, GetTokenInformation failed, Last Error: %d"), dwError));
+			}
+			else
+			{
+				fIsElevated = elevation.TokenIsElevated == 1;
+			}
+		}
+	}
+
+	if (hProcess != NULL)
+		CloseHandle(hProcess);
+	if (hToken != NULL)
+		CloseHandle(hToken);
+
+	return fIsElevated;
+}

+ 6 - 0
UAC_Helper.h

@@ -4,5 +4,11 @@ class CUAC_Helper
 public:
 	CUAC_Helper(void);
 	~CUAC_Helper(void);
+
+	static bool PasteAsAdmin(HWND hWnd);
+
+	static bool AmIRunningElevated();
+	static bool AreTheyRunningElevated(HWND hWnd);
+	static bool RunningElevated(HANDLE h, bool defaultValue);
 };
 

+ 11 - 1
UAC_Thread.cpp

@@ -57,8 +57,9 @@ CString CUAC_Thread::EnumName(eUacThreadEvents e)
 	return _T("");
 }
 
-void CUAC_Thread::UACPaste()
+bool CUAC_Thread::UACPaste()
 {
+	bool ret = true;
 	CString mutexName;
 	mutexName.Format(_T("DittoAdminPaste_%d"), GetCurrentProcessId());
 
@@ -66,6 +67,7 @@ void CUAC_Thread::UACPaste()
 	DWORD dwError = GetLastError();
 	if(dwError == ERROR_ALREADY_EXISTS)
 	{
+		Log(_T("Paste uac admin exe is already running just signalling paste"));
 	}
 	else
 	{
@@ -83,6 +85,12 @@ void CUAC_Thread::UACPaste()
 
 			if (!ShellExecuteEx(&sei))
 			{
+				Log(_T("Failed to startup paste as admin app, we are not pasting using admin app"));
+				ret = false;
+			}
+			else
+			{
+				Log(_T("Startup up ditto paste as admin app, this will send ctrl-v to the admin app"));
 			}
 		}
 	}
@@ -90,4 +98,6 @@ void CUAC_Thread::UACPaste()
 	FirePaste();
 
 	CloseHandle(mutex);
+
+	return ret;
 }

+ 1 - 1
UAC_Thread.h

@@ -27,7 +27,7 @@ public:
 		FireEvent(UAC_EXIT);
 	}
 
-	void UACPaste();
+	bool UACPaste();
 
 private:
 	virtual void OnEvent(int eventId, void *param);