Latest post of the previous page:
Нашёл в чём дело.Была отключена "[ ] use additional privileges".
В таком случае всё как я описал. Если включить, то при старте Far'a запрашиваются привилегии.
Latest post of the previous page:
Нашёл в чём дело.Code: Select all
local z = ffi.new("char[?]", #n+1)
ffi.copy(z, n)
В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.zg wrote:альтернативный вариант попроще.
там написано — можно, кстати. но да, ошибка.John Doe wrote:В функцию AdjustTokenPrivileges в качестве BufferLength надо передавать 0.
Похоже на то )2useven10 wrote:с этого момента скрипт считаю идеальным.
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
EnablePrivileges("SeBackupPrivilege","SeRestorePrivilege")
Пользовательские права и всё такое прочее у меня уже много лет не меняются. Просто вот заметил, что стало запрашивать привилегии. Сначала и разбираться на стал в течении скольких-то сборок, потом… В общем, когда дошли руки, с трудом вспомнил, что что-то такое автостартующее на тему привилегий было, пока нашёл, где и что оно и откуда я его взял.
Ошибку теперь не выдаёт, но и привилегии запрашивает.