2016-12-10 9 views
1

Я пытаюсь взять на себя ответственность каталога с помощью следующего кода:Принимая право собственности на каталог Windows, с результатами Python в «отказано в доступе» ошибка

sd = win32security.SECURITY_DESCRIPTOR() 
sd.SetSecurityDescriptorOwner(curUser, False) 
win32security.SetFileSecurity("C:/ProgramData/Test", 
    win32security.OWNER_SECURITY_INFORMATION, sd) 

SetFileSecurity вызов терпит неудачу с «Доступ запрещен» ошибка ,

Права доступа для текущего пользователя были удалены из этого каталога. В проводнике я вижу это, но когда я пытаюсь открыть его, я сначала должен взять на себя управление в качестве администратора. Это работает в Explorer, но приведенный выше код выполняется с повышенными разрешениями, и по какой-то причине он по-прежнему не работает. Какие-либо предложения?

+0

Вы должны включить SeTakeOwnershipPrivilege в первую очередь. (Не знаю, как вы это делаете в Python, но я уверен, что это возможно.) –

+0

@Harry, используйте функции из [win32security] (http://docs.activestate.com/activepython/2.7/pywin32/win32security. html) (например, 'OpenProcessToken',' LookupPrivilegeValue', 'AdjustTokenPrivileges'), которые в основном похожи на то, что вы делали бы на C, за исключением использования списков и кортежей Python вместо C-массивов и структур. – eryksun

ответ

1

Вы можете принудительно получить право собственности, включив SeTakeOwnerShipPrivilege, но, конечно, только если ваш токен доступа имеет эту привилегию (например, администратор с повышенными правами). Кроме того, вы можете принудительно назначить право собственности другому лицу с ценной бумагой, например SYSTEM, включив SeRestorePrivilege. Без последнего назначение может завершиться с кодом ошибки ERROR_INVALID_OWNER.

Функция set_file_owner имеет опцию force, которая пытается временно включить обе эти привилегии.

import win32api 
import win32security 

def set_file_owner(path, sid=None, force=False): 
    try: 
     hToken = win32security.OpenThreadToken(win32api.GetCurrentThread(), 
        win32security.TOKEN_ALL_ACCESS, True) 
    except win32security.error: 
     hToken = win32security.OpenProcessToken(win32api.GetCurrentProcess(), 
        win32security.TOKEN_ALL_ACCESS) 
    if sid is None: 
     sid = win32security.GetTokenInformation(hToken, 
       win32security.TokenOwner) 
    prev_state =() 
    if force: 
     new_state = [(win32security.LookupPrivilegeValue(None, name), 
         win32security.SE_PRIVILEGE_ENABLED) 
         for name in (win32security.SE_TAKE_OWNERSHIP_NAME, 
            win32security.SE_RESTORE_NAME)] 
     prev_state = win32security.AdjustTokenPrivileges(hToken, False, 
         new_state) 
    try: 
     sd = win32security.SECURITY_DESCRIPTOR() 
     sd.SetSecurityDescriptorOwner(sid, False) 
     win32security.SetFileSecurity(path, 
      win32security.OWNER_SECURITY_INFORMATION, sd) 
    finally: 
     if prev_state: 
      win32security.AdjustTokenPrivileges(hToken, False, prev_state) 

def get_file_owner(path): 
    sd = win32security.GetFileSecurity(path, 
      win32security.OWNER_SECURITY_INFORMATION) 
    sid = sd.GetSecurityDescriptorOwner() 
    return win32security.LookupAccountSid(None, sid) 

Пример

if __name__ == '__main__': 
    import os 
    import tempfile 
    import subprocess 

    username = os.environ['UserName'] 
    test_path = tempfile.mkdtemp() 
    print('Test path: {}'.format(test_path)) 
    subprocess.call(['icacls.exe', test_path, '/setowner', 'SYSTEM'], 
        creationflags=8) 
    owner = get_file_owner(test_path) 
    print('Initial owner: {}\\{}'.format(owner[1], owner[0])) 
    try: 
     print('Denying write owner access') 
     subprocess.call(['icacls.exe', test_path, '/deny', 
         '{}:(WO)'.format(username)], creationflags=8) 
     try: 
      set_file_owner(test_path) 
     except win32security.error: 
      print('Trying with force=True') 
      try: 
       set_file_owner(test_path, force=True) 
      except win32security.error: 
       pass 
    finally: 
     owner = get_file_owner(test_path) 
     print('Final owner: {}\\{}'.format(owner[1], owner[0])) 
     os.rmdir(test_path) 

Выход

Test path: C:\Users\eryksun\AppData\Local\Temp\tmpizgemrdz 
Initial owner: NT AUTHORITY\SYSTEM 
Denying write owner access 
Trying with force=True 
Final owner: BUILTIN\Administrators 

 Смежные вопросы

  • Нет связанных вопросов^_^