Получение привилегий 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: 11215
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 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: 11215
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 times

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

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

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

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

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

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

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

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

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

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

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

User avatar
John Doe
Бюрократ
Posts: 11215
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 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: 3004
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 82 times

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

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

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

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

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

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

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

За компанию приведу и свой вариант:
  1. local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
  2. local nfo = Info { _filename or ...,
  3.   name        = "EnablePrivileges";
  4.   description = "Enable backup/restore privileges";
  5.   version     = "1.0.1"; --http://semver.org/lang/ru/
  6.   author      = "jd";
  7.   url         = "http://forum.farmanager.com/viewtopic.php?f=15&t=8707&p=119955#p119955";
  8.   id          = "D33958E7-4A30-47CB-9F07-C2E1B254154E";
  9.  
  10.   options     = {
  11.     autostart = true,
  12.   }
  13. }
  14. if not nfo then return end
  15.  
  16. local ffi = require("ffi")
  17. local C =  ffi.C
  18. local advapi32 = ffi.load("advapi32")
  19.  
  20. ffi.cdef[[
  21. //http://msdn.microsoft.com/library/ms683179
  22. HANDLE GetCurrentProcess(void);         //WINAPI
  23.  
  24. //http://msdn.microsoft.com/library/ms724211
  25. BOOL CloseHandle(                       //WINAPI
  26.   HANDLE hObject                        //_In_
  27. );
  28.  
  29. //http://msdn.microsoft.com/library/ms679360
  30. DWORD GetLastError(void);
  31.  
  32. //http://msdn.microsoft.com/library/aa379295
  33. BOOL OpenProcessToken(                  //WINAPI
  34.   HANDLE ProcessHandle,                 //_In_
  35.   DWORD DesiredAccess,                  //_In_
  36.   PHANDLE TokenHandle                   //_Out_
  37. );
  38.  
  39. //http://msdn.microsoft.com/library/aa379261
  40. typedef struct {                        //_LUID
  41.   DWORD LowPart;
  42.   LONG  HighPart;
  43. } LUID, *PLUID;
  44.  
  45. //http://msdn.microsoft.com/library/aa379263
  46. typedef struct {                        //_LUID_AND_ATTRIBUTES
  47.   LUID  Luid;
  48.   DWORD Attributes;
  49. } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
  50.  
  51. //http://msdn.microsoft.com/library/aa379630
  52. typedef struct {                        //_TOKEN_PRIVILEGES
  53.   DWORD               PrivilegeCount;
  54.   LUID_AND_ATTRIBUTES Privileges[?];    //ANYSIZE_ARRAY
  55. } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
  56.  
  57. //http://msdn.microsoft.com/library/aa379180
  58. BOOL LookupPrivilegeValueA(             //WINAPI
  59.   LPCSTR lpSystemName,                  //_In_opt_ //LPCTSTR
  60.   LPCSTR lpName,                        //_In_     //LPCTSTR
  61.   PLUID lpLuid                          //_Out_
  62. );
  63.  
  64. //http://msdn.microsoft.com/library/aa375202
  65. BOOL AdjustTokenPrivileges(             //WINAPI
  66.   HANDLE TokenHandle,                   //_In_
  67.   BOOL DisableAllPrivileges,            //_In_
  68.   PTOKEN_PRIVILEGES NewState,           //_In_opt_
  69.   DWORD BufferLength,                   //_In_
  70.   PTOKEN_PRIVILEGES PreviousState,      //_Out_opt_
  71.   PDWORD ReturnLength                   //_Out_opt_
  72. );
  73. ]]
  74.  
  75. local TOKEN_ADJUST_PRIVILEGES = 0x0020
  76. local SE_PRIVILEGE_ENABLED    = 0x0002
  77. local FALSE,NO_ERROR = 0,0
  78.  
  79. --https://msdn.microsoft.com/library/bb530716
  80. local function EnablePrivileges(...)
  81.   --luacheck: max code line length 140
  82.   local nNames = select('#',...)
  83.   local state = ffi.new("TOKEN_PRIVILEGES",nNames,nNames)
  84.   --local size = n*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("uint32_t")
  85.   --local buffer = ffi.new("char[?]",size)
  86.   --local state = ffi.cast("TOKEN_PRIVILEGES*",buffer)
  87.   --state.PrivilegeCount=#names
  88.   for i=1,nNames do
  89.     local p = state.Privileges[i-1]
  90.     if FALSE == advapi32.LookupPrivilegeValueA(nil,select('#',...),p.Luid) then return nil,"LookupPrivilegeValue" end
  91.     p.Attributes = SE_PRIVILEGE_ENABLED
  92.   end
  93.   local ptoken = ffi.new("void*[1]")
  94.   if FALSE==advapi32.OpenProcessToken(C.GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,ptoken) then return nil,"OpenProcessToken" end
  95.   if FALSE==advapi32.AdjustTokenPrivileges(ffi.gc(ptoken[0],C.CloseHandle),0,state,0,nil,nil) then return nil,"AdjustTokenPrivileges" end
  96.   return C.GetLastError()==NO_ERROR
  97. end
  98.  
  99. function nfo:execute()
  100.   if Far.IsUserAdmin then
  101.     if EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege") then
  102.       far.Message("Success!",self.name)
  103.     else
  104.       far.Message("Failed",self.name,nil,"w")
  105.     end
  106.   else
  107.     far.Message("User must be admin",self.name,nil,"w")
  108.   end
  109. end
  110.  
  111. if Macro then
  112.   if nfo.options.autostart and not _G.runonce_done and Far.IsUserAdmin then
  113.     EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege")
  114.   end
  115. else
  116.   nfo:execute()
  117. end
Отличия такие:
  • На вход принимается сразу весь список необходимых привилегий, и соответственно устанавливаются они за один вызов AdjustTokenPrivileges.
    EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege")
  • В случае неудачи вторым значением возвращается имя функции, в которой произошла ошибка
Для нашей задачи это всё конечно непринципиально.
Last edited by John Doe on Fri 08 Sep, 2017 20:17, edited 2 times in total.

User avatar
Wave
Posts: 1716
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: 5201
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 148 times

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

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

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

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

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

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

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

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

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

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

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

User avatar
Wave
Posts: 1716
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: 11215
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 14 times
Been thanked: 80 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: 1716
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 “Обсуждение макросов”