the patch file
Matthias schrieb am Donnerstag, 7. Januar 2021 um 18:51:50 UTC+1:

>
> I tried to post this already, I could not find it afterward. So if this 
> message is duplcated, pardon me please.
>
> I would like to solve ab problem and have created a patch for it as basis 
> for discussions.
>
> The problem, it can be reproduced the following way:
> - Windows with activated User Acces Control
> - local workspace, wich is checked out by someon else, eg. the admin.
> - you have insufficient rights to change files or the workspace metadata 
> (.svn folder)
> - starting a TortoiseSvn-Operation by shell context menu, wich needs to 
> write someting to the workspace or workspace-meta-DB (.svn-Folder)
>
> Result:
> operations fails with error messages. (for example "Can't add files to 
> ignore list") 
> Starting explorer in admin mode does not help. Shell context menu commands 
> will nevertheless run in lower prileges. I'm not sure why, but I guess this 
> is because TortoiseSvn-Shell starts TortoiseSvnProc as a new proccess.
>
> Workaround:
> You can start another tool, e.g. Notepad++ in Adminstrator mode and 
> perform the operations in its file dialog. (e.g. in "Save file as..")
> But this is very annoying because this means a lot of extra clicks. If you 
> forget it your operations fails. You might have do execute cleanup...
>
> My Idea:
> Enhance TortoiseSvn with a special mode, that executes all relevant 
> commands with UAC elevation.
> The mode can be activated in TortoiseSvn-Advanced Settings. 
> ("ElevateUACForLocalWorkspace")
>
> The patch file is based on the current trunk. (r29048)
> Where can I upload the patch?
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"TortoiseSVN-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tortoisesvn-dev/42f42e5c-a8bc-44d0-a4a4-1d7c3c80b656n%40googlegroups.com.
Index: doc/source/en/TortoiseSVN/tsvn_dug/dug_settings_advanced.xml
===================================================================
--- doc/source/en/TortoiseSVN/tsvn_dug/dug_settings_advanced.xml        
(revision 29048)
+++ doc/source/en/TortoiseSVN/tsvn_dug/dug_settings_advanced.xml        
(working copy)
@@ -201,6 +201,18 @@
       </listitem>
     </varlistentry>
     <varlistentry>
+      <term condition="pot">ElevateUACForLocalWorkspace</term>
+      <listitem>
+        <para>
+          If you are working on workspaces wich needs a higher level of 
+          Windows User Access Control set the value to <literal>true</literal>.
+        </para>
+        <para>
+          All shell context menu commands wich might change the local worksace 
will ask for admin rights.
+        </para>
+      </listitem>
+    </varlistentry>
+    <varlistentry>
       <term condition="pot">FixCaseRenames</term>
       <listitem>
         <para>
Index: src/TortoiseProc/Settings/SettingsAdvanced.cpp
===================================================================
--- src/TortoiseProc/Settings/SettingsAdvanced.cpp      (revision 29048)
+++ src/TortoiseProc/Settings/SettingsAdvanced.cpp      (working copy)
@@ -93,6 +93,10 @@
     settings[i].type    = CSettingsAdvanced::SettingTypeNumber;
     settings[i++].def.l = 3;
 
+    settings[i].sName   = L"ElevateUACForLocalWorkspace";
+    settings[i].type    = CSettingsAdvanced::SettingTypeBoolean;
+    settings[i++].def.b = false;
+
     settings[i].sName = L"FixCaseRenames";
     settings[i].type    = CSettingsAdvanced::SettingTypeBoolean;
     settings[i++].def.b = true;
Index: src/TortoiseShell/ContextMenu.cpp
===================================================================
--- src/TortoiseShell/ContextMenu.cpp   (revision 29048)
+++ src/TortoiseShell/ContextMenu.cpp   (working copy)
@@ -39,183 +39,183 @@
 CShellExt::MenuInfo CShellExt::menuInfo[] =
 {
     { ShellMenuCheckout,                    MENUCHECKOUT,       IDI_CHECKOUT,  
         IDS_MENUCHECKOUT,           IDS_MENUDESCCHECKOUT,
-    { ITEMIS_FOLDER | ITEMIS_ONLYONE, ITEMIS_INSVN | ITEMIS_FOLDERINSVN }, { 
ITEMIS_FOLDER | ITEMIS_ONLYONE | ITEMIS_EXTENDED | ITEMIS_INSVN | 
ITEMIS_FOLDERINSVN, 0 }, { 0, 0 }, { 0, 0 }, L"tsvn_checkout" },
+    { ITEMIS_FOLDER | ITEMIS_ONLYONE, ITEMIS_INSVN | ITEMIS_FOLDERINSVN }, { 
ITEMIS_FOLDER | ITEMIS_ONLYONE | ITEMIS_EXTENDED | ITEMIS_INSVN | 
ITEMIS_FOLDERINSVN, 0 }, { 0, 0 }, { 0, 0 }, L"tsvn_checkout", true },
 
     { ShellMenuUpgradeWC,                       MENUUPGRADE,    IDI_CLEANUP,   
         IDS_MENUUPGRADE,            IDS_MENUDESCUPGRADE,
-        {ITEMIS_UNSUPPORTEDFORMAT, 0}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_upgradewc" },
+        {ITEMIS_UNSUPPORTEDFORMAT, 0}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_upgradewc", true },
 
     { ShellMenuUpdate,                      MENUUPDATE,         IDI_UPDATE,    
         IDS_MENUUPDATE,             IDS_MENUDESCUPDATE,
-        {ITEMIS_INSVN,  ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_update" 
},
+        {ITEMIS_INSVN,  ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_update", 
true },
 
     { ShellMenuCommit,                      MENUCOMMIT,         IDI_COMMIT,    
         IDS_MENUCOMMIT,             IDS_MENUDESCCOMMIT,
-        {ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_commit" },
+        {ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_commit", true },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}},
 
     { ShellMenuDiff,                        MENUDIFF,           IDI_DIFF,      
         IDS_MENUDIFF,               IDS_MENUDESCDIFF,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_TWO, 0}, 
{ITEMIS_PROPMODIFIED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, L"tsvn_diff" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_TWO, 0}, 
{ITEMIS_PROPMODIFIED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, L"tsvn_diff", true },
 
     { ShellMenuDiffLater,                   MENUDIFFLATER,      IDI_DIFF,      
         IDS_MENUDIFFLATER,          IDS_MENUDESCDIFFLATER,
-        {ITEMIS_ONLYONE, ITEMIS_FOLDER}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_difflater" },
+        {ITEMIS_ONLYONE, ITEMIS_FOLDER}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_difflater", false },
 
     { ShellMenuDiffNow,                     MENUDIFFNOW,        IDI_DIFF,      
         IDS_MENUDIFFNOW,            IDS_MENUDESCDIFFNOW,
-        {ITEMIS_ONLYONE|ITEMIS_HASDIFFLATER, ITEMIS_FOLDER}, {0, 0}, {0, 0}, 
{0, 0}, L"tsvn_diffnow" },
+        {ITEMIS_ONLYONE|ITEMIS_HASDIFFLATER, ITEMIS_FOLDER}, {0, 0}, {0, 0}, 
{0, 0}, L"tsvn_diffnow", false },
 
     { ShellMenuPrevDiff,                    MENUPREVDIFF,           IDI_DIFF,  
             IDS_MENUPREVDIFF,           IDS_MENUDESCPREVDIFF,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_prevdiff" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_prevdiff", false },
 
     { ShellMenuUrlDiff,                     MENUURLDIFF,        IDI_DIFF,      
         IDS_MENUURLDIFF,            IDS_MENUDESCURLDIFF,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED|ITEMIS_ONLYONE, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_urldiff" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED|ITEMIS_ONLYONE, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_urldiff", false },
 
     { ShellMenuUnifiedDiff,                 MENUUNIDIFF,        IDI_DIFF,      
         IDS_MENUUNIDIFF,            IDS_MENUUNIDESCDIFF,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_unifieddiff" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_unifieddiff", false },
 
     { ShellMenuLog,                         MENULOG,            IDI_LOG,       
         IDS_MENULOG,                IDS_MENUDESCLOG,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_ADDEDWITHHISTORY|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, L"tsvn_log" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_ADDEDWITHHISTORY|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, L"tsvn_log", false },
 
     { ShellMenuRepoBrowse,                  MENUREPOBROWSE,     
IDI_REPOBROWSE,         IDS_MENUREPOBROWSE,         IDS_MENUDESCREPOBROWSE,
-        {ITEMIS_ONLYONE, 0}, {ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_repobrowse" },
+        {ITEMIS_ONLYONE, 0}, {ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_repobrowse", false },
 
     { ShellMenuShowChanged,                 MENUSHOWCHANGED,    
IDI_SHOWCHANGED,        IDS_MENUSHOWCHANGED,        IDS_MENUDESCSHOWCHANGED,
-        {ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_showchanged"},
+        {ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_showchanged", false },
 
     { ShellMenuRevisionGraph,               MENUREVISIONGRAPH,  
IDI_REVISIONGRAPH,      IDS_MENUREVISIONGRAPH,      IDS_MENUDESCREVISIONGRAPH,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_revisiongraph"},
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_revisiongraph", 
false },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
 
     { ShellMenuConflictEditor,              MENUCONFLICTEDITOR, IDI_CONFLICT,  
         IDS_MENUCONFLICT,           IDS_MENUDESCCONFLICT,
-        {ITEMIS_CONFLICTED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_conflicteditor" },
+        {ITEMIS_CONFLICTED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_conflicteditor", true },
 
     { ShellMenuResolve,                     MENURESOLVE,        IDI_RESOLVE,   
         IDS_MENURESOLVE,            IDS_MENUDESCRESOLVE,
-        {ITEMIS_CONFLICTED, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_resolve" },
+        {ITEMIS_CONFLICTED, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_resolve", true },
 
     { ShellMenuUpdateExt,                   MENUUPDATEEXT,      IDI_UPDATE,    
         IDS_MENUUPDATEEXT,          IDS_MENUDESCUPDATEEXT,
-        {ITEMIS_INSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_updateext" },
+        {ITEMIS_INSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_updateext", true },
 
     { ShellMenuRename,                      MENURENAME,         IDI_RENAME,    
         IDS_MENURENAME,             IDS_MENUDESCRENAME,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_FILEEXTERNAL|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
{0, 0}, L"tsvn_rename" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_FILEEXTERNAL|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
{0, 0}, L"tsvn_rename", true },
 
     { ShellMenuRemove,                      MENUREMOVE,         IDI_DELETE,    
         IDS_MENUREMOVE,             IDS_MENUDESCREMOVE,
-        {ITEMIS_INSVN|ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_ADDED|ITEMIS_FILEEXTERNAL|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, {0, 0}, {0, 0}, L"tsvn_remove" },
+        {ITEMIS_INSVN|ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_ADDED|ITEMIS_FILEEXTERNAL|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, {0, 0}, {0, 0}, L"tsvn_remove", true },
 
     { ShellMenuRemoveKeep,                  MENUREMOVE,         IDI_DELETE,    
         IDS_MENUREMOVEKEEP,         IDS_MENUDESCREMOVEKEEP,
-        {ITEMIS_INSVN|ITEMIS_INVERSIONEDFOLDER|ITEMIS_EXTENDED, 
ITEMIS_ADDED|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_removekeep" },
+        {ITEMIS_INSVN|ITEMIS_INVERSIONEDFOLDER|ITEMIS_EXTENDED, 
ITEMIS_ADDED|ITEMIS_WCROOT|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_removekeep", true },
 
     { ShellMenuRevert,                      MENUREVERT,         IDI_REVERT,    
         IDS_MENUREVERT,             IDS_MENUDESCREVERT,
-        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_revert" },
+        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_revert", true },
 
     { ShellMenuRevert,                      MENUREVERT,         IDI_REVERT,    
         IDS_MENUUNDOADD,            IDS_MENUDESCUNDOADD,
-        {ITEMIS_ADDED, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_ADDED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_revert" },
+        {ITEMIS_ADDED, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_ADDED, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_revert", true },
 
     { ShellMenuDelUnversioned,              MENUDELUNVERSIONED, 
IDI_DELUNVERSIONED,     IDS_MENUDELUNVERSIONED,     IDS_MENUDESCDELUNVERSIONED,
-        {ITEMIS_FOLDER|ITEMIS_INSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_delunversioned" },
+        {ITEMIS_FOLDER|ITEMIS_INSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_delunversioned", true },
 
     { ShellMenuCleanup,                     MENUCLEANUP,        IDI_CLEANUP,   
         IDS_MENUCLEANUP,            IDS_MENUDESCCLEANUP,
-        {ITEMIS_INSVN|ITEMIS_FOLDER, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_FOLDER, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_cleanup" },
+        {ITEMIS_INSVN|ITEMIS_FOLDER, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN|ITEMIS_FOLDER, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_cleanup", true },
 
     { ShellMenuLock,                        MENULOCK,           IDI_LOCK,      
         IDS_MENU_LOCK,              IDS_MENUDESC_LOCK,
-        {ITEMIS_INSVN, ITEMIS_LOCKED|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_LOCKED|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, {0, 0}, L"tsvn_lock" },
+        {ITEMIS_INSVN, ITEMIS_LOCKED|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_LOCKED|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 
0}, {0, 0}, L"tsvn_lock", true },
 
     { ShellMenuUnlock,                      MENUUNLOCK,         IDI_UNLOCK,    
         IDS_MENU_UNLOCK,            IDS_MENUDESC_UNLOCK,
-        {ITEMIS_INSVN|ITEMIS_LOCKED, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, L"tsvn_unlock" },
+        {ITEMIS_INSVN|ITEMIS_LOCKED, ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, L"tsvn_unlock", true },
 
     { ShellMenuUnlockForce,                 MENUUNLOCK,         IDI_UNLOCK,    
         IDS_MENU_UNLOCKFORCE,       IDS_MENUDESC_UNLOCKFORCE,
-        {ITEMIS_INSVN|ITEMIS_LOCKED|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDER|ITEMIS_INSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_unlockforce" },
+        {ITEMIS_INSVN|ITEMIS_LOCKED|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDER|ITEMIS_INSVN|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_unlockforce", true },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
 
     { ShellMenuCopy,                        MENUCOPY,           IDI_COPY,      
         IDS_MENUBRANCH,             IDS_MENUDESCCOPY,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_copy" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_copy", true },
 
     { ShellMenuSwitch,                      MENUSWITCH,         IDI_SWITCH,    
         IDS_MENUSWITCH,             IDS_MENUDESCSWITCH,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_switch" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_switch", true },
 
     { ShellMenuMerge,                       MENUMERGE,          IDI_MERGE,     
         IDS_MENUMERGE,              IDS_MENUDESCMERGE,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_merge" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, 
{0, 0}, {0, 0}, L"tsvn_merge", true },
     { ShellMenuMergeAll,                    MENUMERGEALL,       IDI_MERGE,     
         IDS_MENUMERGEALL,           IDS_MENUDESCMERGEALL,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_mergeall" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_EXTENDED, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_mergeall", true },
 
     { ShellMenuExport,                      MENUEXPORT,         IDI_EXPORT,    
         IDS_MENUEXPORT,             IDS_MENUDESCEXPORT,
         {ITEMIS_FOLDER|ITEMIS_ONLYONE, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 
0}, {0, 0}, L"tsvn_export" },
 
     { ShellMenuRelocate,                    MENURELOCATE,       IDI_RELOCATE,  
         IDS_MENURELOCATE,           IDS_MENUDESCRELOCATE,
-        
{ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_WCROOT, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_WCROOT, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_relocate" },
+        
{ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_WCROOT, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_FOLDERINSVN|ITEMIS_ONLYONE|ITEMIS_WCROOT, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_relocate", true },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
 
     { ShellMenuCreateRepos,                 MENUCREATEREPOS,    
IDI_CREATEREPOS,        IDS_MENUCREATEREPOS,        IDS_MENUDESCCREATEREPOS,
-        {ITEMIS_FOLDER|ITEMIS_ONLYONE, ITEMIS_INSVN|ITEMIS_FOLDERINSVN}, {0, 
0}, {0, 0}, {0, 0}, L"tsvn_createrepo" },
+        {ITEMIS_FOLDER|ITEMIS_ONLYONE, ITEMIS_INSVN|ITEMIS_FOLDERINSVN}, {0, 
0}, {0, 0}, {0, 0}, L"tsvn_createrepo", true },
 
     { ShellMenuAdd,                         MENUADD,            IDI_ADD,       
         IDS_MENUADD,                IDS_MENUDESCADD,
-        {ITEMIS_INVERSIONEDFOLDER|ITEMIS_FOLDER, 
ITEMIS_INSVN|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_INSVN|ITEMIS_FOLDER, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_IGNORED|ITEMIS_FOLDER, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_DELETED, 
ITEMIS_FOLDER|ITEMIS_ONLYONE|ITEMIS_UNSUPPORTEDFORMAT}, L"tsvn_add" },
+        {ITEMIS_INVERSIONEDFOLDER|ITEMIS_FOLDER, 
ITEMIS_INSVN|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_INSVN|ITEMIS_FOLDER, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_IGNORED|ITEMIS_FOLDER, 
ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_DELETED, 
ITEMIS_FOLDER|ITEMIS_ONLYONE|ITEMIS_UNSUPPORTEDFORMAT}, L"tsvn_add", true },
 
     { ShellMenuAdd,                         MENUADD,            IDI_ADD,       
         IDS_MENUADDIMMEDIATE,       IDS_MENUDESCADD,
-        {ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {ITEMIS_IGNORED, 
ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_DELETED, 
ITEMIS_FOLDER|ITEMIS_ONLYONE|ITEMIS_UNSUPPORTEDFORMAT}, L"tsvn_add" },
+        {ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {ITEMIS_IGNORED, 
ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_DELETED, 
ITEMIS_FOLDER|ITEMIS_ONLYONE|ITEMIS_UNSUPPORTEDFORMAT}, L"tsvn_add", true },
 
     { ShellMenuAddAsReplacement,            MENUADD,            IDI_ADD,       
         IDS_MENUADDASREPLACEMENT,   IDS_MENUADDASREPLACEMENT,
-        {ITEMIS_DELETED|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_addasreplacement" },
+        {ITEMIS_DELETED|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_addasreplacement", true },
 
     { ShellMenuImport,                      MENUIMPORT,         IDI_IMPORT,    
         IDS_MENUIMPORT,             IDS_MENUDESCIMPORT,
-        {ITEMIS_FOLDER, ITEMIS_INSVN}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_import" 
},
+        {ITEMIS_FOLDER, ITEMIS_INSVN}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_import", 
false },
 
     { ShellMenuBlame,                       MENUBLAME,          IDI_BLAME,     
         IDS_MENUBLAME,              IDS_MENUDESCBLAME,
-        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_blame" },
+        {ITEMIS_INSVN|ITEMIS_ONLYONE, 
ITEMIS_FOLDER|ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_blame", false },
 
     { ShellMenuCopyUrl,                     MENUCOPYURL,        IDI_COPYURL,   
         IDS_MENUCOPYURL,            IDS_MENUDESCCOPYURL,
-        { ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT }, { 0, 0 }, { 0, 0 }, { 0, 0 
}, L"tsvn_copyurl" },
+        { ITEMIS_INSVN, ITEMIS_UNSUPPORTEDFORMAT }, { 0, 0 }, { 0, 0 }, { 0, 0 
}, L"tsvn_copyurl", false },
 
     { ShellMenuIgnoreSub,                   MENUIGNORE,         IDI_IGNORE,    
         IDS_MENUIGNORE,             IDS_MENUDESCIGNORE,
-        {ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_IGNORED|ITEMIS_INSVN|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_ignoresub" },
+        {ITEMIS_INVERSIONEDFOLDER, 
ITEMIS_IGNORED|ITEMIS_INSVN|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_ignoresub", true },
 
     { ShellMenuDeleteIgnoreSub,             MENUIGNORE,         IDI_IGNORE,    
         IDS_MENUDELETEIGNORE,       IDS_MENUDESCDELETEIGNORE,
-        {ITEMIS_INVERSIONEDFOLDER|ITEMIS_INSVN, 
ITEMIS_IGNORED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_deleteignoresub" },
+        {ITEMIS_INVERSIONEDFOLDER|ITEMIS_INSVN, 
ITEMIS_IGNORED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, 
L"tsvn_deleteignoresub", true },
 
     { ShellMenuUnIgnoreSub,                 MENUIGNORE,         IDI_IGNORE,    
         IDS_MENUUNIGNORE,           IDS_MENUDESCUNIGNORE,
-        {ITEMIS_IGNORED, 0}, {0, 0}, {0, 0}, {0, 0} , L"tsvn_unignoresub"},
+        {ITEMIS_IGNORED, 0}, {0, 0}, {0, 0}, {0, 0} , L"tsvn_unignoresub", 
true},
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
 
     { ShellMenuShelve,                      MENUSHELVE,         IDI_SHELVE,    
         IDS_MENUSHELVE,             IDS_MENUDESCSHELVE,
-        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_shelve" 
},
+        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, L"tsvn_shelve", 
true },
 
     { ShellMenuUnshelve,                    MENUUNSHELVE,       IDI_UNSHELVE,  
         IDS_MENUUNSHELVE,           IDS_MENUDESCUNSHELVE,
-        {ITEMIS_INSVN, 0}, { 0, 0 }, { 0, 0 }, {0, 0}, L"tsvn_unshelve" },
+        {ITEMIS_INSVN, 0}, { 0, 0 }, { 0, 0 }, {0, 0}, L"tsvn_unshelve", true 
},
 
     { ShellMenuCreatePatch,                 MENUCREATEPATCH,    
IDI_CREATEPATCH,        IDS_MENUCREATEPATCH,        IDS_MENUDESCCREATEPATCH,
-        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_createpatch" },
+        {ITEMIS_INSVN, ITEMIS_NORMAL|ITEMIS_UNSUPPORTEDFORMAT}, 
{ITEMIS_FOLDERINSVN, ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, 
L"tsvn_createpatch", false },
 
     { ShellMenuApplyPatch,                  MENUAPPLYPATCH,     IDI_PATCH,     
         IDS_MENUAPPLYPATCH,         IDS_MENUDESCAPPLYPATCH,
-        {ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_ONLYONE|ITEMIS_PATCHFILE, 0}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, 
L"tsvn_applypatch" },
+        {ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_FOLDERINSVN, 
ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {ITEMIS_ONLYONE|ITEMIS_PATCHFILE, 0}, 
{ITEMIS_FOLDERINSVN, ITEMIS_ADDED|ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, 
L"tsvn_applypatch", true },
 
     { ShellMenuProperties,                  MENUPROPERTIES,     
IDI_PROPERTIES,         IDS_MENUPROPERTIES,         IDS_MENUDESCPROPERTIES,
-        {ITEMIS_INSVN, 0}, {ITEMIS_FOLDERINSVN, 0}, {0, 0}, {0, 0}, 
L"tsvn_properties" },
+        {ITEMIS_INSVN, 0}, {ITEMIS_FOLDERINSVN, 0}, {0, 0}, {0, 0}, 
L"tsvn_properties", true },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
     { ShellMenuClipPaste,                   MENUCLIPPASTE,      IDI_CLIPPASTE, 
         IDS_MENUCLIPPASTE,          IDS_MENUDESCCLIPPASTE,
-        {ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_PATHINCLIPBOARD, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_clippaste" },
+        {ITEMIS_INSVN|ITEMIS_FOLDER|ITEMIS_PATHINCLIPBOARD, 
ITEMIS_UNSUPPORTEDFORMAT}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_clippaste", true },
 
     { ShellSeparator, 0, 0, 0, 0, {0, 0}, {0, 0}, {0, 0}, {0, 0}, L""},
 
     { ShellMenuSettings,                    MENUSETTINGS,       IDI_SETTINGS,  
         IDS_MENUSETTINGS,           IDS_MENUDESCSETTINGS,
-        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, 
L"tsvn_settings" },
+        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, 
L"tsvn_settings", false },
     { ShellMenuHelp,                        MENUHELP,           IDI_HELP,      
         IDS_MENUHELP,               IDS_MENUDESCHELP,
-        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, L"tsvn_help" },
+        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, L"tsvn_help", 
false },
     { ShellMenuAbout,                       MENUABOUT,          IDI_ABOUT,     
         IDS_MENUABOUT,              IDS_MENUDESCABOUT,
-        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, L"tsvn_about" 
},
+        {ITEMIS_FOLDER, 0}, {0, ITEMIS_FOLDER}, {0, 0}, {0, 0}, L"tsvn_about", 
false },
 
     // the sub menus - they're not added like the the commands, therefore the 
menu ID is zero
     // but they still need to be in here, because we use the icon and string 
information anyway.
     { ShellSubMenu,                         NULL,               IDI_APP,       
         IDS_MENUSUBMENU,            0,
-        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenu" },
+        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenu", false },
     { ShellSubMenuFile,                     NULL,               IDI_MENUFILE,  
         IDS_MENUSUBMENU,            0,
-        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenufile" },
+        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenufile", false },
     { ShellSubMenuFolder,                   NULL,               
IDI_MENUFOLDER,         IDS_MENUSUBMENU,            0,
-        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenufolder" },
+        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenufolder", false },
     { ShellSubMenuLink,                     NULL,               IDI_MENULINK,  
         IDS_MENUSUBMENU,            0,
-        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenulink" },
+        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenulink", false },
     { ShellSubMenuMultiple,                 NULL,               
IDI_MENUMULTIPLE,       IDS_MENUSUBMENU,            0,
-        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenumultiple" },
+        {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"tsvn_submenumultiple", false },
     // mark the last entry to tell the loop where to stop iterating over this 
array
     { ShellMenuLastEntry,                   0,                  0,             
         0,                          0,
         {0, 0}, {0, 0}, {0, 0}, {0, 0}, L"" },
@@ -1333,6 +1333,15 @@
         tstring tortoiseProcPath = GetAppDirectory() + L"TortoiseProc.exe";
         tstring tortoiseMergePath = GetAppDirectory() + L"TortoiseMerge.exe";
         tstring cwdFolder;
+        boolean elevateUAC = false;
+        for (int menuIndex = 0; menuInfo[menuIndex].command != 
ShellMenuLastEntry; menuIndex++)
+        {
+            if (menuInfo[menuIndex].command == (SVNCommands)id_it->second)
+            {
+                elevateUAC = menuInfo[menuIndex].elevateUAC;
+                break;
+            }
+        }
         if (folder_.empty() && files_.empty())
         {
             // use the users desktop path as the CWD
@@ -1686,7 +1695,7 @@
             myIDMap.clear();
             myVerbsIDMap.clear();
             myVerbsMap.clear();
-            RunCommand(tortoiseMergePath, svnCmd, cwdFolder, L"TortoiseMerge 
launch failed" );
+            RunCommand(tortoiseMergePath, svnCmd, cwdFolder, L"TortoiseMerge 
launch failed", elevateUAC);
             return S_OK;
         case ShellMenuRevisionGraph:
             AddPathCommand(svnCmd, L"revisiongraph", true);
@@ -1769,7 +1778,7 @@
             myIDMap.clear();
             myVerbsIDMap.clear();
             myVerbsMap.clear();
-            RunCommand(tortoiseProcPath, svnCmd, cwdFolder, L"TortoiseProc 
Launch failed");
+            RunCommand(tortoiseProcPath, svnCmd, cwdFolder, L"TortoiseProc 
Launch failed", elevateUAC);
         }
         return S_OK;
     } // if (id_it != myIDMap.end() && id_it->first == idCmd)
@@ -2429,14 +2438,30 @@
 }
 
 void CShellExt::RunCommand(const tstring& path, const tstring& command,
-    const tstring& folder, LPCTSTR errorMessage)
+    const tstring& folder, LPCTSTR errorMessage, boolean elevateUAC)
 {
-    if (CCreateProcessHelper::CreateProcessDetached(path.c_str(),
-        command.c_str(), folder.c_str()))
+    bool settingElevateUAC =
+        !!CRegDWORD(L"Software\\TortoiseSVN\\ElevateUACForLocalWorkspace", 
FALSE);
+
+    if (settingElevateUAC && elevateUAC)
     {
-        // process started - exit
-        return;
+        if (CCreateProcessHelper::ShellExecuteDetachted(path.c_str(),
+                       command.c_str(), folder.c_str(), true),
+            elevateUAC)
+        {
+            // process started - exit
+            return;
+        }
     }
+    else
+    {
+           if (CCreateProcessHelper::CreateProcessDetached(path.c_str(),
+               command.c_str(), folder.c_str()))
+           {
+               // process started - exit
+               return;
+           }
+    }
 
     CFormatMessageWrapper errorDetails;
     MessageBox( NULL, errorDetails, errorMessage, MB_OK | MB_ICONINFORMATION );
Index: src/TortoiseShell/ShellExt.h
===================================================================
--- src/TortoiseShell/ShellExt.h        (revision 29048)
+++ src/TortoiseShell/ShellExt.h        (working copy)
@@ -181,6 +181,8 @@
         YesNoPair           third;
         YesNoPair           fourth;
         std::wstring        verb;
+        //if true run commands in UAC higher priveleges, if enhancend in 
advanced settings
+        bool                elevateUAC;
     };
 
     static MenuInfo                 menuInfo[];
@@ -232,7 +234,7 @@
     void            GetMainColumnStatus(const TCHAR * path, BOOL bIsDir);
     STDMETHODIMP    QueryDropContext(UINT uFlags, UINT idCmdFirst, HMENU 
hMenu, UINT &indexMenu);
     bool            IsIllegalFolder(const std::wstring& folder, int * 
csidlarray);
-    static void     RunCommand( const tstring& path, const tstring& command, 
const tstring& folder, LPCTSTR errorMessage );
+    static void     RunCommand( const tstring& path, const tstring& command, 
const tstring& folder, LPCTSTR errorMessage, boolean elevateUAC);
     bool            ShouldInsertItem(const MenuInfo& pair) const;
     bool            ShouldEnableMenu(const YesNoPair& pair) const;
     void            GetColumnInfo(SHCOLUMNINFO* to, DWORD index, UINT 
charactersCount, UINT titleId, UINT descriptionId);
Index: src/Utils/CreateProcessHelper.h
===================================================================
--- src/Utils/CreateProcessHelper.h     (revision 29048)
+++ src/Utils/CreateProcessHelper.h     (working copy)
@@ -39,6 +39,10 @@
                     LPCTSTR lpCurrentDirectory);
     static bool CreateProcessDetached(LPCTSTR lpApplicationName,
                     LPCTSTR lpCommandLine);
+                    
+       static bool ShellExecuteDetachted(LPCTSTR lpApplicationName,
+                               LPCTSTR lpCommandLine,
+                               LPCTSTR lpCurrentDirectory, boolean elevateUAC);
 };
 
 inline bool CCreateProcessHelper::CreateProcess(LPCTSTR applicationName,
@@ -97,6 +101,29 @@
     return true;
 }
 
+inline bool CCreateProcessHelper::ShellExecuteDetachted(LPCTSTR 
lpApplicationName,
+    LPCTSTR lpCommandLine, LPCTSTR lpCurrentDirectory, boolean elevateUAC)
+{
+
+    SHELLEXECUTEINFO shExInfo = {0};
+    shExInfo.cbSize           = sizeof(shExInfo);
+    shExInfo.fMask            = SEE_MASK_NOCLOSEPROCESS;
+    shExInfo.hwnd             = 0;
+    shExInfo.lpFile           = lpApplicationName;
+    shExInfo.lpParameters     = lpCommandLine;
+    shExInfo.lpDirectory      = lpCurrentDirectory;
+    shExInfo.nShow            = SW_SHOW;
+    shExInfo.hInstApp         = 0;
+    if (elevateUAC)
+    shExInfo.lpVerb           = _T("runas");
+
+    if (ShellExecuteEx(&shExInfo))
+        if (shExInfo.hProcess != 0)
+            CloseHandle(shExInfo.hProcess);
+
+    return true;
+}
+
 inline bool CCreateProcessHelper::CreateProcessDetached(LPCTSTR 
lpApplicationName,
     LPCTSTR lpCommandLine)
 {

Reply via email to