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

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

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

Post by Denis »

Latest post of the previous page:

Нашёл в чём дело.
Была отключена "[ ] use additional privileges".
В таком случае всё как я описал. Если включить, то при старте Far'a запрашиваются привилегии.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

2useven10

Code: Select all

local z = ffi.new("char[?]", #n+1)
ffi.copy(z, n)
В этом нет необходимости.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Применение скриптов из данной темы приводит к тому, что активированные привилегии наследуются всеми процессами, запущеными впоследствии из фара.
Это неизбежно?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

zg wrote:альтернативный вариант попроще.
В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.
User avatar
zg
zero-gravity
Posts: 6015
Joined: Tue 15 Mar, 2005 17:36
Location: riga
Been thanked: 185 times
Contact:

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

Post by zg »

John Doe wrote:В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.
там написано — можно, кстати. но да, ошибка.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

2useven10
pcall не нужен, если в typedef использовать структуры не присваивая типу структуры имя (а у вас именно так)
http://forum.farmanager.com/viewtopic.p ... 51#p119951

Можно все определения сделать в одном блоке ffi.cdef
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

Поправил последний раз, с этого момента скрипт считаю идеальным.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

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

За компанию приведу и свой вариант:

Code: Select all

local Info = Info or package.loaded.regscript or function(...) return ... end --luacheck: ignore 113/Info
local nfo = Info { _filename or ...,
  name        = "EnablePrivileges";
  description = "Enable backup/restore privileges";
  version     = "1.1"; --http://semver.org/lang/ru/
  author      = "jd";
  url         = "http://forum.farmanager.com/viewtopic.php?f=15&t=8707&p=119955#p119955";
  id          = "D33958E7-4A30-47CB-9F07-C2E1B254154E";

  options     = {
    autostart = true,
  }
}
if not nfo then return end

local ffi = require("ffi")
local C =  ffi.C
local advapi32 = ffi.load("advapi32")

ffi.cdef[[
//http://msdn.microsoft.com/library/ms683179
HANDLE GetCurrentProcess(void);         //WINAPI

//http://msdn.microsoft.com/library/ms724211
BOOL CloseHandle(                       //WINAPI
  HANDLE hObject                        //_In_
);

//http://msdn.microsoft.com/library/ms679360
DWORD GetLastError(void);

//http://msdn.microsoft.com/library/aa379295
BOOL OpenProcessToken(                  //WINAPI
  HANDLE ProcessHandle,                 //_In_
  DWORD DesiredAccess,                  //_In_
  PHANDLE TokenHandle                   //_Out_
);

//http://msdn.microsoft.com/library/aa379261
typedef struct {                        //_LUID
  DWORD LowPart;
  LONG  HighPart;
} LUID, *PLUID;

//http://msdn.microsoft.com/library/aa379263
typedef struct {                        //_LUID_AND_ATTRIBUTES
  LUID  Luid;
  DWORD Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;

//http://msdn.microsoft.com/library/aa379630
typedef struct {                        //_TOKEN_PRIVILEGES
  DWORD               PrivilegeCount;
  LUID_AND_ATTRIBUTES Privileges[?];    //ANYSIZE_ARRAY
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

//http://msdn.microsoft.com/library/aa379180
BOOL LookupPrivilegeValueA(             //WINAPI
  LPCSTR lpSystemName,                  //_In_opt_ //LPCTSTR
  LPCSTR lpName,                        //_In_     //LPCTSTR
  PLUID lpLuid                          //_Out_
);

//http://msdn.microsoft.com/library/aa375202
BOOL AdjustTokenPrivileges(             //WINAPI
  HANDLE TokenHandle,                   //_In_
  BOOL DisableAllPrivileges,            //_In_
  PTOKEN_PRIVILEGES NewState,           //_In_opt_
  DWORD BufferLength,                   //_In_
  PTOKEN_PRIVILEGES PreviousState,      //_Out_opt_
  PDWORD ReturnLength                   //_Out_opt_
);
]]

local TOKEN_ADJUST_PRIVILEGES = 0x0020
local SE_PRIVILEGE_ENABLED    = 0x0002
local FALSE,NO_ERROR = 0,0

--https://msdn.microsoft.com/library/bb530716
local function EnablePrivileges(...)
  --luacheck: max code line length 140
  local nNames = select('#',...)
  local state = ffi.new("TOKEN_PRIVILEGES",nNames,nNames)
  --local size = n*ffi.sizeof("LUID_AND_ATTRIBUTES") + ffi.sizeof("uint32_t")
  --local buffer = ffi.new("char[?]",size)
  --local state = ffi.cast("TOKEN_PRIVILEGES*",buffer)
  --state.PrivilegeCount=#names
  for i=1,nNames do
    local p = state.Privileges[i-1]
    if FALSE == advapi32.LookupPrivilegeValueA(nil,select(i,...),p.Luid) then return nil,"LookupPrivilegeValue" end
    p.Attributes = SE_PRIVILEGE_ENABLED
  end
  local ptoken = ffi.new("void*[1]")
  if FALSE==advapi32.OpenProcessToken(C.GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,ptoken) then return nil,"OpenProcessToken" end
  if FALSE==advapi32.AdjustTokenPrivileges(ffi.gc(ptoken[0],C.CloseHandle),0,state,0,nil,nil) then return nil,"AdjustTokenPrivileges" end
  return C.GetLastError()==NO_ERROR
end

function nfo:execute()
  if Far.IsUserAdmin then
    if EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege") then
      far.Message("Success!",self.name)
    else
      far.Message("Failed",self.name,nil,"w")
    end
  else
    far.Message("User must be admin",self.name,nil,"w")
  end
end

if Macro then
  if nfo.options.autostart and select(2,...)==1 and Far.IsUserAdmin then --runonce
    EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege")
  end
else
  nfo:execute()
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: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

Где-то между 4622 и 4747 это перестало работать.
Во всяком случае при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии, при варианте от John Doe при старте фара выдаётся ошибка cannot convert 'number' to 'struct 2812 [1]', а вариант от zg я что-то не понял, как использовать. Назвал _macroinit.moon, перезапустил фар, ошибок не выдало, но при входе в System Volume Information запросило привилегии.
Пользуюсь ФАРом больше 20 лет © собирательный.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

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

Post by Shmuel »

Wave wrote: Назвал _macroinit.moon
Это ничего не даёт. Особо обрабатывается только _macroinit.lua.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Wave wrote: при варианте от John Doe при старте фара выдаётся ошибка
Исправил
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

Wave wrote: при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии
У меня всё работает. Может запускать стали не от админа?
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

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 наобновлялось прилично, может там чего…
Пользуюсь ФАРом больше 20 лет © собирательный.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Обновил свой вариант (изменения минимальные).
Теперь скрипт скрипт работает даже будучи просто запущенным из командной строки.
А если положить в scripts, то можно запускать из ScriptBrowser.
За автозапуск отвечает опция, которой можно управлять средствами cfgscript.
ccaid
Posts: 908
Joined: Fri 12 Jun, 2009 16:04
Has thanked: 24 times
Been thanked: 6 times

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

Post by ccaid »

Фар делают добрые люди
User avatar
Wave
Posts: 1885
Joined: Thu 04 Aug, 2005 18:47
Has thanked: 14 times
Been thanked: 26 times

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

Post by Wave »

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

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