Latest post of the previous page:
Но вот если нажать CtrlR, то содержимое "System Volume Information" появляется (если макрос есть).Получение привилегий backup/restore
Re: Запрос дополнительных привилегий при поиске
Нашёл в чём дело.
Была отключена "[ ] use additional privileges".
В таком случае всё как я описал. Если включить, то при старте Far'a запрашиваются привилегии.
Была отключена "[ ] use additional privileges".
В таком случае всё как я описал. Если включить, то при старте Far'a запрашиваются привилегии.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Запрос дополнительных привилегий при поиске
2useven10
В этом нет необходимости.
Code: Select all
local z = ffi.new("char[?]", #n+1)
ffi.copy(z, n)
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Получение привилегий backup/restore
Применение скриптов из данной темы приводит к тому, что активированные привилегии наследуются всеми процессами, запущеными впоследствии из фара.
Это неизбежно?
Это неизбежно?
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Запрос дополнительных привилегий при поиске
В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.zg wrote:альтернативный вариант попроще.
- zg
- zero-gravity
- Posts: 6035
- Joined: Tue 15 Mar, 2005 17:36
- Location: riga
- Been thanked: 185 times
- Contact:
Re: Запрос дополнительных привилегий при поиске
там написано — можно, кстати. но да, ошибка.John Doe wrote:В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Re: Получение привилегий backup/restore
2useven10
pcall не нужен, если в typedef использовать структуры не присваивая типу структуры имя (а у вас именно так)
http://forum.farmanager.com/viewtopic.p ... 51#p119951
Можно все определения сделать в одном блоке ffi.cdef
pcall не нужен, если в typedef использовать структуры не присваивая типу структуры имя (а у вас именно так)
http://forum.farmanager.com/viewtopic.p ... 51#p119951
Можно все определения сделать в одном блоке ffi.cdef
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Получение привилегий backup/restore
Похоже на то )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.
Получение привилегий backup/restore
Где-то между 4622 и 4747 это перестало работать.
Во всяком случае при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии, при варианте от John Doe при старте фара выдаётся ошибка cannot convert 'number' to 'struct 2812 [1]', а вариант от zg я что-то не понял, как использовать. Назвал _macroinit.moon, перезапустил фар, ошибок не выдало, но при входе в System Volume Information запросило привилегии.
Во всяком случае при наличии _macroinit.lua варианта от 2useven10 при входе в System Volume Information стали снова запрашиваться привилегии, при варианте от John Doe при старте фара выдаётся ошибка cannot convert 'number' to 'struct 2812 [1]', а вариант от zg я что-то не понял, как использовать. Назвал _macroinit.moon, перезапустил фар, ошибок не выдало, но при входе в System Volume Information запросило привилегии.
Пользуюсь ФАРом больше 20 лет © собирательный.
Получение привилегий backup/restore
Пользовательские права и всё такое прочее у меня уже много лет не меняются. Просто вот заметил, что стало запрашивать привилегии. Сначала и разбираться на стал в течении скольких-то сборок, потом… В общем, когда дошли руки, с трудом вспомнил, что что-то такое автостартующее на тему привилегий было, пока нашёл, где и что оно и откуда я его взял.
А заодно нашёлся бэкап фара-плагинов-макросов 4622, и эта сборка и сборная солянка на этой же машине работает по-прежнему, молча заходит в закрытые папки, автоматически повышая привилегии.
Ошибку теперь не выдаёт, но и привилегии запрашивает.
P.s. Впрочем, проверил, скачал архив 4747 с сайта, распаковал, закинул _macroinit.lua в соотв. место, запустил — оба варианта, от John Doe и 2useven10 работают. Ясно, будем искать, что мешает. Но честно, полный х.з. — уж что-что, а на тему автостартующих макросов у меня ничего такого не добавлялось, что могло бы на привилегии повлиять. Хотя, конечно, всяких сложных макросов типа LuaManager наобновлялось прилично, может там чего…
Пользуюсь ФАРом больше 20 лет © собирательный.
- John Doe
- Бюрократ
- Posts: 13855
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 428 times
- Contact:
Получение привилегий backup/restore
Обновил свой вариант (изменения минимальные).
Теперь скрипт скрипт работает даже будучи просто запущенным из командной строки.
А если положить в scripts, то можно запускать из ScriptBrowser.
За автозапуск отвечает опция, которой можно управлять средствами cfgscript.
Теперь скрипт скрипт работает даже будучи просто запущенным из командной строки.
А если положить в scripts, то можно запускать из ScriptBrowser.
За автозапуск отвечает опция, которой можно управлять средствами cfgscript.