Что нового

Как бы получить владельца папки через WinAPI либо другим способом?

Gennadiy

Новичок
Сообщения
10
Репутация
0
Версия AutoIt: 3.2.5.4

Описание:

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

На просторах Интернета (англоязычного) нашёл описание функции, которую можно составить:
Код:
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 и т. п.) .

Примечания:
 

Khaibit

Осваивающий
Сообщения
103
Репутация
25
Код:
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
 
Автор
G

Gennadiy

Новичок
Сообщения
10
Репутация
0
Re: Как бы получить владельца папки через WinAPI либо другим способом? [Решено]

Khaibit сказал(а):
Код:
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 (в эту сторону не пробовал плясать сам), но главное работает, причём, как для папок, так и для файлов! Тему пометил как решённую:smile:
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
#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))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Gennadiy

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


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

Gennadiy

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Код:
#include "ExtProp.au3" ; https://www.autoitscript.com/forum/topic/25859-udf-get-extended-file-property/
Спасибо, оно тоже работает! Пожалуй, я воспользуюсь именно этим решением. Так как известны случаи на нашем предприятии, когда WMI не работало по тем или иным причинам. А тут вроде как-то по другому действует.


Добавлено:
Сообщение автоматически объединено:

Garrett сказал(а):
Gennadiy

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


Хорошо, постараюсь. Я видел это в правилах, но как-то просто не нашёл кнопки "Ответить" на сообщение вообще без цитирования (привык такой кнопкой пользоваться), а посчитал неудобным обрезать весь код. В общем, понял, буду иметь ввиду![/warn]
 
Верх