Автор Тема: Как бы получить владельца папки через WinAPI либо другим способом?  (Прочитано 248 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн Gennadiy [?]

  • Новичок
  • *
  • Сообщений: 3
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.x.x
Версия AutoIt: 3.2.5.4

Описание:

Здравствуйте, есть у меня такая задача: надо узнать владельца папки или файла, ну скажем, "C:\Test" на AutoIT. Как я понимаю, самое оптимальное решение - это воспользоваться функциями Windows API, благо AutoIT может их вызывать. Есть такая функция GetSecurityInfo() в Windows API - вроде именно, то что надо. Посмотрел, что можно было бы подключить из папки Include с уже готовыми функциями - такую функцию там не нашёл. Пробовал самостоятельно через DllCall() написать код, но что-то где-то я, видимо не понимаю. Если кто-нибудь поможет - будут очень благодарен.

На просторах Интернета (англоязычного) нашёл описание функции, которую можно составить:
Код: AutoIt [Выделить]
Func GetSecurityInfo($handle, $ObjectType, $SecurityInfo, $ppsidOwner, $ppsidGroup, $ppDacl, $ppSacl, $ppSecurityDescriptor)
        $call = DllCall("Advapi32.dll", "long", "GetSecurityInfo", _
                        "ptr", $handle, _
                        "int", $ObjectType, _
                        "dword", $SecurityInfo, _
                        "ptr", $ppsidOwner, _
                        "ptr", $ppsidGroup, _
                        "ptr", $ppDacl, _
                        "ptr", $ppSacl, _
                        "ptr", $ppSecurityDescriptor)
        Return $call[0]
EndFunc   ;==>GetSecurityInfo
 


Там только функция, насчёт применения не нашёл ничего. Правильно я понимаю, что $handle можно получить с помощью FileOpen()? $ObjectType и $SecurityInfo - я подсунул значения "SE_FILE_OBJECT" и "OWNER_SECURITY_INFORMATION" соответственно. Но что-то не работает. В идеале бы создать такую функцию, в которую я подставляю только путь к папке или файлу и она мне на выходе даёт владельца (можно без расшифровки SID и т. п.) .

Примечания:

Русское сообщество AutoIt


Оффлайн Khaibit [?]

  • Новичок
  • *
  • Сообщений: 55
  • Репутация: 13
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.6.1
Код: AutoIt [Выделить]
ConsoleWrite(_FileGetOwner(@ScriptDir) & @CRLF)

Func _FileGetOwner($sFile, $sComputer = ".")
    Local $objWMI, $colItems, $objItem, $strOwner = ""

    $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    If Not (IsObj($objWMI)) Then Return SetError(1, 0, "")
    $colItems = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & $sFile & "'}" _
             & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    If Not (IsObj($colItems)) Then Return SetError(2, 0, "")
    For $objItem In $colItems
        $strOwner = $objItem.ReferencedDomainName & "\" & $objItem.AccountName
        If $strOwner == "\" Then $strOwner = $objItem.SID
    Next

    Return $strOwner
EndFunc   ;==>_FileGetOwner


Оффлайн Gennadiy [?]

  • Новичок
  • *
  • Сообщений: 3

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.x.x
Код: AutoIt [Выделить]
ConsoleWrite(_FileGetOwner(@ScriptDir) & @CRLF)

Func _FileGetOwner($sFile, $sComputer = ".")
    Local $objWMI, $colItems, $objItem, $strOwner = ""

    $objWMI = ObjGet("winmgmts:\\" & $sComputer & "\root\cimv2")
    If Not (IsObj($objWMI)) Then Return SetError(1, 0, "")
    $colItems = $objWMI.ExecQuery("ASSOCIATORS OF {Win32_LogicalFileSecuritySetting='" & $sFile & "'}" _
             & " WHERE AssocClass=Win32_LogicalFileOwner ResultRole=Owner")
    If Not (IsObj($colItems)) Then Return SetError(2, 0, "")
    For $objItem In $colItems
        $strOwner = $objItem.ReferencedDomainName & "\" & $objItem.AccountName
        If $strOwner == "\" Then $strOwner = $objItem.SID
    Next

    Return $strOwner
EndFunc   ;==>_FileGetOwner


Спасибо, здорово выручили! Тут через WMI (в эту сторону не пробовал плясать сам), но главное работает, причём, как для папок, так и для файлов! Тему пометил как решённую:)

Помечен как лучший ответ пользователем Gennadiy Отправлен Ноябрь 08, 2017, 09:25:35

Оффлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3579
  • Репутация: 947
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include "ExtProp.au3" ; https://www.autoitscript.com/forum/topic/25859-udf-get-extended-file-property/

; идентификаторы свойств
For $i = 0 To 300
  $Prop = _GetExtProperty("C:\", $i)
  ConsoleWrite($i & ":" & $Prop & @CRLF)
Next

; владелец = 10
MsgBox(0, "", _GetExtProperty(@WindowsDir, 10))


Русское сообщество AutoIt


Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3989
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Gennadiy

ПредупреждениеЗа нарушение общих правил (пункт В.2):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.

Скорблю и помню.




Оффлайн Gennadiy [?]

  • Новичок
  • *
  • Сообщений: 3

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.2.x.x
Код: AutoIt [Выделить]
#include "ExtProp.au3" ; https://www.autoitscript.com/forum/topic/25859-udf-get-extended-file-property/

Спасибо, оно тоже работает! Пожалуй, я воспользуюсь именно этим решением. Так как известны случаи на нашем предприятии, когда WMI не работало по тем или иным причинам. А тут вроде как-то по другому действует.


Добавлено: Ноябрь 08, 2017, 09:28:19
Gennadiy

ПредупреждениеСтарайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.



Хорошо, постараюсь. Я видел это в правилах, но как-то просто не нашёл кнопки "Ответить" на сообщение вообще без цитирования (привык такой кнопкой пользоваться), а посчитал неудобным обрезать весь код. В общем, понял, буду иметь ввиду!
« Последнее редактирование: Ноябрь 08, 2017, 09:32:21 от Gennadiy »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
2945 Просмотров
Последний ответ Декабрь 03, 2010, 15:51:26
от CreatoR
9 Ответов
4009 Просмотров
Последний ответ Декабрь 24, 2010, 10:24:39
от Sp01LeR
2 Ответов
4774 Просмотров
Последний ответ Декабрь 23, 2012, 01:28:46
от amee
3 Ответов
2135 Просмотров
Последний ответ Сентябрь 06, 2011, 19:50:24
от Fever
22 Ответов
8210 Просмотров
Последний ответ Сентябрь 11, 2017, 15:58:31
от muskin2029
3 Ответов
2568 Просмотров
Последний ответ Ноябрь 15, 2011, 23:41:42
от SyDr
3 Ответов
2058 Просмотров
Последний ответ Декабрь 09, 2011, 15:57:29
от Medic84
11 Ответов
2293 Просмотров
Последний ответ Июнь 02, 2015, 19:49:19
от InnI
2 Ответов
535 Просмотров
Последний ответ Июнь 26, 2016, 13:45:04
от Yuriy09
30 Ответов
1479 Просмотров
Последний ответ Март 19, 2017, 22:53:16
от Alofa