Что нового

[Данные, строки] Анализ данных из cmd

k790

Новичок
Сообщения
239
Репутация
1
Здравствуйте, подскажите, как лучше сделать:
есть программа cacls.exe (имеется в windows и работает из cmd), надо узнать кто и какими правами обладает.
Для этого надо выполнить cacls file или папка.

Так вот как лучше получить список кто и какие права имеет? (нужны только "все" и "система"/"system")
Думал разделить на подстроки:
Код:
#include 'encoding.au3'	
$u1='C:\Windows\inf\usbstor.inf'
$s_Read = ''
$i_PID = Run("cacls" & ' ' & $u1, '', @SW_HIDE, 6)
While 1
	$s_Read &= StdoutRead($i_PID)
	If @error Then ExitLoop
	Sleep(1)
WEnd

$str = _Encoding_866To1251($s_Read)
$st1=StringReplace ($str, ' ', ' ')
$strs=StringSplit ($st2, ' ')


Но между строками остаётся символ новая строка, которую не получилось убрать.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
k790,
Можно примерно так.
Код:
$aStr = StringSplit(StringStripCR(StringStripWS(StringReplace($str, $u1, ''), 3)), @LF)
For $i = 1 To $aStr[0]
	ConsoleWrite(StringStripWS($aStr[$i], 3) & @LF)
Next
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
madmasles
мне только не понятно, зачем дважды употреблять
Код:
StringStripWS
и не понял как работает флаг 3
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
k790 [?]
мне только не понятно, зачем дважды употреблять
В данном случае первый раз, чтобы в массиве не было последней пустой строки (можно сделать по другому).
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
madmasles [?]
В данном случае первый раз, чтобы в массиве не было последней пустой строки (можно сделать по другому).
А второй раз зачем? Ведь уже нет пустых строк, откуда они взялись?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё вариант:

Код:
#include <Array.au3>
#include <Constants.au3>
#include 'Encoding.au3'

$u1 = 'C:\Windows\inf\usbstor.inf'

$i_PID = Run('cacls "' & $u1 & '"', '', @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($i_PID)
$s_Read = StdoutRead($i_PID)
$s_Read = _Encoding_866To1251($s_Read)
$s_Read = StringReplace($s_Read, $u1, '')
$a_Read = StringRegExp($s_Read, '(?mi)^\h*(.+?)\h*$', 3)
$s_Read = _ArrayToString($a_Read, @CRLF)

_ArrayDisplay($a_Read)
MsgBox(64, 'Title', $s_Read)
ConsoleWrite($s_Read & @LF)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR
Никак не пойму регулярные выражения, я думаю вот так лучше:
Код:
$aStr = StringSplit(StringStripCR(StringReplace($str, $u1, '')), @LF)
For $i = 1 To $aStr[0]
    ConsoleWrite(StringStripWS($aStr[$i], 3) & @LF)
Next
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Оптимизированный вариант CreatoR :smile:
Код:
#include <Array.au3>
#include <Constants.au3>
#include 'Encoding.au3'

$u1 = 'C:\Windows\inf\usbstor.inf'

$i_PID = Run('cacls "' & $u1 & '"', '', @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($i_PID)
$s_Read = StdoutRead($i_PID)
$s_Read = _Encoding_866To1251($s_Read)
$s_Read = StringRegExpReplace($s_Read, '.*((BUILTIN\\|NT AUTHORITY\\).*)', '$1')

MsgBox(64, 'Title', $s_Read)
ConsoleWrite($s_Read & @LF)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
А пояснить можешь, что делает строка:
Код:
$s_Read = StringRegExpReplace($s_Read, '.*((BUILTIN\\|NT AUTHORITY\\).*)', '$1')




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

Был не прав, вариант madmasles правильнее, но почему в массиве взялись отступы, если их удалили, не понятно?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Garrett [?]
Оптимизированный вариант CreatoR`а
Без использования Encoding.au3:

Код:
#include <Array.au3>
#include <Constants.au3>
#include <WinAPI.au3>

$u1 = 'C:\Windows\inf\usbstor.inf'

$i_PID = Run('Cacls "' & $u1 & '"', '', @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($i_PID)
$s_Read = _WinAPI_MultiByteToWideChar(StdoutRead($i_PID), 1, 0, True)
$s_Read = StringStripWS(StringRegExpReplace($s_Read, '.*((?:BUILTIN|NT AUTHORITY)\\[^\h]+)\h+', '$1'), 3)

MsgBox(64, 'Title', $s_Read)
ConsoleWrite($s_Read & @LF)
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR
А чем это лучше?

И вообще может кто-нибудь сказать, всё описанное тут это альтернатива или есть какое-то решение лучше?

Так же мы чуть-чуть ушли в сторону, забыли про вторую часть, получить в одной строке все данные одного пользователя получили, а вот как разделить, то есть:

Все:F
NT AUTHORITY\система:F
BUILTIN\Администраторы:F
BUILTIN\Пользователи:R

в XP он немного отличается (вместо система, system, а так же нет "ID")
Теперь нужно знать какое значение у "Все" и "система"|"SYSTEM", в голову пришла одна мысль: с права отсчитать один символ - значение, второй-: не в счёт, и дальше уже брать по количеству букв в слове (Все - 3 буквы, начиная с третьего символа справа, по такому же принципу система и system), но это как-то не правильно, не так ли?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
k790 [?]
Ничем, просто по другому.

И вообще может кто-нибудь сказать, всё описанное тут это альтернатива или есть какое-то решение лучше?
Всегда может найтись лучшее решение, альтернатива понятие относительное/философское :smile:.

получить в одной строке все данные одного пользователя получили, а вот как разделить
Что конкретно нужно получить на выходе?
 
Автор
K

k790

Новичок
Сообщения
239
Репутация
1
CreatoR [?]
Всегда может найтись лучшее решение
Так вот какое лучшее решение?


Что конкретно нужно получить на выходе?
На выходе я должен знать:
1. Какие права у "Все", то есть имеет доступ или нет (буква пойдёт, которая после двоеточия)
2. Какие права у "SYSTEM" и "система"
3. А вообще надо знать имеет доступ или нет (F или N)
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
k790
Вот библиотека. Мне кажется стоит изучить http://www.autoitscript.com/forum/topic/134508-set-acl-permissions-udf/ . Все же лучше чем разбирать вывод консоли.
 
Верх