Получение привилегий backup/restore

Здесь обсуждается всё, что касается макросов.
Denis
Posts: 1390
Joined: Tue 05 Apr, 2005 18:12
Has thanked: 2 times
Been thanked: 2 times

Re: Запрос дополнительных привилегий при поиске

Post by Denis » Wed 18 Jun, 2014 07:37

Latest post of the previous page:

Нашёл в чём дело.
Была отключена "[ ] use additional privileges".
В таком случае всё как я описал. Если включить, то при старте Far'a запрашиваются привилегии.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Запрос дополнительных привилегий при поиске

Post by John Doe » Wed 18 Jun, 2014 07:46

2useven10

Code: Select all

local z = ffi.new("char[?]", #n+1)
ffi.copy(z, n)
В этом нет необходимости.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Получение привилегий backup/restore

Post by John Doe » Wed 18 Jun, 2014 09:20

Применение скриптов из данной темы приводит к тому, что активированные привилегии наследуются всеми процессами, запущеными впоследствии из фара.
Это неизбежно?

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Запрос дополнительных привилегий при поиске

Post by John Doe » Wed 18 Jun, 2014 11:32

zg wrote:альтернативный вариант попроще.
В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.

User avatar
zg
zero-gravity
Posts: 5235
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 42 times
Contact:

Re: Запрос дополнительных привилегий при поиске

Post by zg » Wed 18 Jun, 2014 23:01

John Doe wrote:В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.
там написано — можно, кстати. но да, ошибка.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Re: Получение привилегий backup/restore

Post by John Doe » Fri 20 Jun, 2014 08:31

2useven10
pcall не нужен, если в typedef использовать структуры не присваивая типу структуры имя (а у вас именно так)
viewtopic.php?p=119951#p119951

Можно все определения сделать в одном блоке ffi.cdef

2useven10
Posts: 2977
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

Re: Получение привилегий backup/restore

Post by 2useven10 » Fri 20 Jun, 2014 13:53

Поправил последний раз, с этого момента скрипт считаю идеальным.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Получение привилегий backup/restore

Post by John Doe » Fri 20 Jun, 2014 14:52

2useven10 wrote:с этого момента скрипт считаю идеальным.
Похоже на то )
Разве что не уверен в необходимости TOKEN_QUERY (у zg работает и без него).

За компанию приведу и свой вариант:
Code: [Select all] [Expand/Collapse] [Download] (EnablePrivileges.lua)
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2.  
  3. local nfo = Info { _filename or ...,
  4.  
  5.   name        = "EnablePrivileges";
  6.  
  7.   description = "Enable backup/restore privileges";
  8.  
  9.   version     = "1"; --http://semver.org/lang/ru/
  10.  
  11.   author      = "jd";
  12.  
  13.   url         = "http://forum.farmanager.com/viewtopic.php?f=15&t=8707&p=119955#p119955";
  14.  
  15.   id          = "D33958E7-4A30-47CB-9F07-C2E1B254154E";
  16.  
  17.  
  18.  
  19.   options     = {
  20.  
  21.     autostart = true,
  22.  
  23.   }
  24.  
  25. }
  26.  
  27. if not nfo then return end
  28.  
  29.  
  30.  
  31. local ffi = require("ffi")
  32.  
  33. local C =  ffi.C
  34.  
  35. local advapi32 = ffi.load("advapi32")
  36.  
  37.  
  38.  
  39. ffi.cdef[[
  40.  
  41. //http://msdn.microsoft.com/library/ms683179
  42.  
  43. HANDLE GetCurrentProcess(void);         //WINAPI
  44.  
  45.  
  46.  
  47. //http://msdn.microsoft.com/library/ms724211
  48.  
  49. BOOL CloseHandle(                       //WINAPI
  50.  
  51.   HANDLE hObject                        //_In_
  52.  
  53. );
  54.  
  55.  
  56.  
  57. //http://msdn.microsoft.com/library/ms679360
  58.  
  59. DWORD GetLastError(void);
  60.  
  61.  
  62.  
  63. //http://msdn.microsoft.com/library/aa379295
  64.  
  65. BOOL OpenProcessToken(                  //WINAPI
  66.  
  67.   HANDLE ProcessHandle,                 //_In_
  68.  
  69.   DWORD DesiredAccess,                  //_In_
  70.  
  71.   PHANDLE TokenHandle                   //_Out_
  72.  
  73. );
  74.  
  75.  
  76.  
  77. //http://msdn.microsoft.com/library/aa379261
  78.  
  79. typedef struct {                        //_LUID
  80.  
  81.   DWORD LowPart;
  82.  
  83.   LONG  HighPart;
  84.  
  85. } LUID, *PLUID;
  86.  
  87.  
  88.  
  89. //http://msdn.microsoft.com/library/aa379263
  90.  
  91. typedef struct {                        //_LUID_AND_ATTRIBUTES
  92.  
  93.   LUID  Luid;
  94.  
  95.   DWORD Attributes;
  96.  
  97. } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
  98.  
  99.  
  100.  
  101. //http://msdn.microsoft.com/library/aa379630
  102.  
  103. typedef struct {                        //_TOKEN_PRIVILEGES
  104.  
  105.   DWORD               PrivilegeCount;
  106.  
  107.   LUID_AND_ATTRIBUTES Privileges[?];    //ANYSIZE_ARRAY
  108.  
  109. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
  110.  
  111.  
  112.  
  113. //http://msdn.microsoft.com/library/aa379180
  114.  
  115. BOOL LookupPrivilegeValueA(             //WINAPI
  116.  
  117.   LPCSTR lpSystemName,                  //_In_opt_ //LPCTSTR
  118.  
  119.   LPCSTR lpName,                        //_In_     //LPCTSTR
  120.  
  121.   PLUID lpLuid                          //_Out_
  122.  
  123. );
  124.  
  125.  
  126.  
  127. //http://msdn.microsoft.com/library/aa375202
  128.  
  129. BOOL AdjustTokenPrivileges(             //WINAPI
  130.  
  131.   HANDLE TokenHandle,                   //_In_
  132.  
  133.   BOOL DisableAllPrivileges,            //_In_
  134.  
  135.   PTOKEN_PRIVILEGES NewState,           //_In_opt_
  136.  
  137.   DWORD BufferLength,                   //_In_
  138.  
  139.   PTOKEN_PRIVILEGES PreviousState,      //_Out_opt_
  140.  
  141.   PDWORD ReturnLength                   //_Out_opt_
  142.  
  143. );
  144.  
  145. ]]
  146.  
  147.  
  148.  
  149. local TOKEN_ADJUST_PRIVILEGES = 0x0020
  150.  
  151. local SE_PRIVILEGE_ENABLED    = 0x0002
  152.  
  153. local FALSE,NO_ERROR = 0,0
  154.  
  155.  
  156.  
  157. local function EnablePrivileges(names)
  158.  
  159.   local state = ffi.new("TOKEN_PRIVILEGES",#names,#names)
  160.  
  161.   --local size = n*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("uint32_t")
  162.  
  163.   --local buffer = ffi.new("char[?]",size)
  164.  
  165.   --local state = ffi.cast("TOKEN_PRIVILEGES*",buffer)
  166.  
  167.   --state.PrivilegeCount=#names
  168.  
  169.   for i=1,#names do
  170.  
  171.     local p = state.Privileges[i-1]
  172.  
  173.     if FALSE == advapi32.LookupPrivilegeValueA(nil, names[i], p.Luid) then return nil,"LookupPrivilegeValue" end
  174.  
  175.     p.Attributes = SE_PRIVILEGE_ENABLED
  176.  
  177.   end
  178.  
  179.   local ptoken = ffi.new("void*[1]")
  180.  
  181.   if FALSE==advapi32.OpenProcessToken(C.GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, ptoken) then return nil,"OpenProcessToken" end
  182.  
  183.   if FALSE==advapi32.AdjustTokenPrivileges(ffi.gc(ptoken[0],C.CloseHandle),0,state,0,nil,nil) then return nil,"AdjustTokenPrivileges" end
  184.  
  185.   return C.GetLastError()==NO_ERROR
  186.  
  187. end
  188.  
  189.  
  190.  
  191. function nfo:execute()
  192.  
  193.   if Far.IsUserAdmin then
  194.  
  195.     if EnablePrivileges{"SeBackupPrivilege","SeRestorePrivilege"} then
  196.  
  197.       far.Message("Success!",self.name)
  198.  
  199.     else
  200.  
  201.       far.Message("Failed",self.name,nil,"w")
  202.  
  203.     end
  204.  
  205.   else
  206.  
  207.     far.Message("User must be admin",self.name,nil,"w")
  208.  
  209.   end
  210.  
  211. end
  212.  
  213.  
  214.  
  215. if Macro then
  216.  
  217.   if nfo.options.autostart and not _G.runonce_done and Far.IsUserAdmin then
  218.  
  219.     EnablePrivileges{"SeBackupPrivilege","SeRestorePrivilege"}
  220.  
  221.   end
  222.  
  223. else
  224.  
  225.   nfo:execute()
  226.  
  227. end
Отличия такие:
  • На вход принимается сразу весь список необходимых привилегий, и соответственно устанавливаются они за один вызов AdjustTokenPrivileges.
    EnablePrivileges{"SeBackupPrivilege","SeRestorePrivilege"}
  • В случае неудачи вторым значением возвращается имя функции, в которой произошла ошибка
Для нашей задачи это всё конечно непринципиально.
Last edited by John Doe on Sun 28 Aug, 2016 16:09, edited 1 time in total.

User avatar
Wave
Posts: 1707
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

Получение привилегий backup/restore

Post by Wave » Fri 19 Aug, 2016 14:08

Где-то между 4622 и 4747 это перестало работать.
Во всяком случае при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии, при варианте от John Doe при старте фара выдаётся ошибка cannot convert 'number' to 'struct 2812 [1]', а вариант от zg я что-то не понял, как использовать. Назвал _macroinit.moon, перезапустил фар, ошибок не выдало, но при входе в System Volume Information запросило привилегии.
Пользуюсь ФАРом больше 15 лет © собирательный.

Shmuel
Posts: 5088
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 11 times
Been thanked: 138 times

Получение привилегий backup/restore

Post by Shmuel » Fri 19 Aug, 2016 14:14

Wave wrote: Назвал _macroinit.moon
Это ничего не даёт. Особо обрабатывается только _macroinit.lua.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Получение привилегий backup/restore

Post by John Doe » Fri 19 Aug, 2016 14:39

Wave wrote: при варианте от John Doe при старте фара выдаётся ошибка
Исправил

2useven10
Posts: 2977
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

Получение привилегий backup/restore

Post by 2useven10 » Fri 19 Aug, 2016 16:17

Wave wrote: при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии
У меня всё работает. Может запускать стали не от админа?

User avatar
Wave
Posts: 1707
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

Получение привилегий backup/restore

Post by Wave » Mon 22 Aug, 2016 09:49

2useven10 wrote:
Wave wrote: при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии
У меня всё работает. Может запускать стали не от админа?
Пользовательские права и всё такое прочее у меня уже много лет не меняются. Просто вот заметил, что стало запрашивать привилегии. Сначала и разбираться на стал в течении скольких-то сборок, потом… В общем, когда дошли руки, с трудом вспомнил, что что-то такое автостартующее на тему привилегий было, пока нашёл, где и что оно и откуда я его взял.
А заодно нашёлся бэкап фара-плагинов-макросов 4622, и эта сборка и сборная солянка на этой же машине работает по-прежнему, молча заходит в закрытые папки, автоматически повышая привилегии.
John Doe wrote:
Wave wrote: при варианте от John Doe при старте фара выдаётся ошибка
Исправил
Ошибку теперь не выдаёт, но и привилегии запрашивает.

P.s. Впрочем, проверил, скачал архив 4747 с сайта, распаковал, закинул _macroinit.lua в соотв. место, запустил — оба варианта, от John Doe и 2useven10 работают. Ясно, будем искать, что мешает. Но честно, полный х.з. — уж что-что, а на тему автостартующих макросов у меня ничего такого не добавлялось, что могло бы на привилегии повлиять. Хотя, конечно, всяких сложных макросов типа LuaManager наобновлялось прилично, может там чего…
Пользуюсь ФАРом больше 15 лет © собирательный.

User avatar
John Doe
Бюрократ
Posts: 11095
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 66 times

Получение привилегий backup/restore

Post by John Doe » Sun 28 Aug, 2016 16:16

Обновил свой вариант (изменения минимальные).
Теперь скрипт скрипт работает даже будучи просто запущенным из командной строки.
А если положить в scripts, то можно запускать из ScriptBrowser.
За автозапуск отвечает опция, которой можно управлять средствами cfgscript.

ccaid
Posts: 805
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 9 times
Been thanked: 5 times

Получение привилегий backup/restore

Post by ccaid » Sun 25 Jun, 2017 20:34

Фар делают добрые люди

User avatar
Wave
Posts: 1707
Joined: Thu 04 Aug, 2005 18:47
Location: Харьков, Украина
Has thanked: 2 times
Been thanked: 9 times
Contact:

Получение привилегий backup/restore

Post by Wave » Mon 26 Jun, 2017 19:33

Скорей всего оно. Но сейчас руки не доходят обновиться. Как обновлюсь — проверю.
Пользуюсь ФАРом больше 15 лет © собирательный.

Post Reply

Return to “Обсуждение макросов”