Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Вывод путей профилей пользователей компьютера (http://forum.oszone.net/showthread.php?t=341036)

Sub-Zero 24-06-2019 15:25 2876672

Вывод путей профилей пользователей компьютера
 
Приветствую! Есть скрипт который выводит пути всех профилей пользователей компьютера, но выводит их с пропусками строк, поскольку сама команда reg query делает эти пустые строки. Можно ли их как-то убрать. Сам не осилил :)
@echo off
for /f "usebackq tokens=2* delims= " %%i in (`reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath"`) do echo.%%j
pause

alpap 24-06-2019 15:57 2876680

Код:

@echo off
for /f "tokens=2*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath"^|findstr /rc:"^[ ][ ]*"') do echo.%%j
pause


Sub-Zero 24-06-2019 16:10 2876682

Спасибо огромное!!! :yahoo:

greg zakharov 24-06-2019 20:07 2876703

alpap, то же, но с малым количеством телодвижений:
Код:

wmic path win32_userprofile get localpath | findstr /vric:"localpath"

Iska 25-06-2019 01:52 2876722

greg zakharov, для чистоты количество телодвижений таки нужно будет увеличить двойным разбором.

Vadikan 25-06-2019 08:57 2876740

Зачем все эти findstr с двойным разбором, если можно просто выводить значения параметров пошиком?
Код:

dir "HKLM:SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" | %{$_.GetValue('ProfileImagePath')}

greg zakharov 25-06-2019 09:02 2876743

Iska, не нужно. Понятие профиля включает в себя не только наличие папки пользователя на диске, но и определенные роли и олицетворения. Так, например, AllUsers в реестре наряду с некоторыми другими значениями едва ли можно отнести к пользовательским профилям. Win32_UserProfile об этом знает и потому возвращает именно профили без каких-либо рудиментарных значений. Кстати, в logon session также далеко не все можно отнести к понятию профиля.

Iska 25-06-2019 17:19 2876807

greg zakharov, Вы о чём-то другом. Я об этом:
Скрытый текст


Vadikan, тогда уж и брать не реестр, а Wbem, как указал коллега greg zakharov.

greg zakharov 25-06-2019 17:46 2876814

Iska, баг Far'а должен сообщить по вашему о чем-то сакральном?

YuS_2 25-06-2019 18:27 2876817

Цитата:

Цитата greg zakharov
баг Far'а должен сообщить по вашему о чем-то сакральном? »

Это не баг Far-а, это таки баг wmic (вернее даже пары wmic|findstr), там лишние символы перевода каретки "\r" (0x0D), да и кучка конечных пробелов тоже не добавляет дополнительного ощущения счастья. :)

greg zakharov 25-06-2019 18:44 2876818

YuS_2, увы нет. Во-первых, такого у wmic не наблюдаю ни в одной из систем, к которым у меня имеется доступ, во-вторых, это не похоже на символ возврата каретки, скорее попытка вернуть буфер целиком (к слову, неплохой вектор для атаки).

YuS_2 25-06-2019 19:11 2876821

Цитата:

Цитата greg zakharov
Во-первых, такого у wmic не наблюдаю ни в одной из систем »

отдельно у wmic - нет, у findstr - тоже нет, а вот именно в таком сочетании:
Код:

wmic path win32_userprofile get localpath | findstr /vric:"localpath" >out.txt

Iska 25-06-2019 22:04 2876836

greg zakharov, так выглядит результат автоперевода перевода из юникод-вывода wmic.exe в OEM при подобных перенаправлениях. Всегда было так.

Vadikan 26-06-2019 11:48 2876889

Цитата:

Цитата Iska
Vadikan, тогда уж и брать не реестр, а Wbem, как указал коллега greg zakharov. »

Почему? Обе команды выводят одни и те же пути, только в моем варианте без лишнего перевода каретки и прочего мусора.
Ах да, еще в моем варианте кириллическое название учетной записи в консоли читается, в отличие от знаков вопроса с wmic/findstr (не тратьте время на объяснения, как с этим справляться).

Sub-Zero 26-06-2019 13:26 2876902

Коллеги, помогите пожалуйста еще с одним действом... Все по той же теме:
for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" /s /v "ProfileImagePath"^|findstr /rc:"^[ ][ ]*"') do (
for /d /r "%b%\AppData\Roaming\1C" %%e in (*) do (for %%k in (vrs-cache SICache Config ConfigSave DBNameCache) do (if /i %%~nxe==%%~k rd /s /q %%e))
)
Подчеркнутая часть не работает. Я так понимаю что новая конструкция for не видит переменную из прежнего цикла.

greg zakharov 26-06-2019 13:47 2876906

Vadikan, а что, собственно, там объяснять? Если консоль правильно нстроена на вывод юникода, никаких вопросов пользователь не увидит.
Iska, не, дело не в переводе из одной кодировки в другую, а в бажных функциях форматирования вывода у wmic. Жаль, что правила форума не позволяют мне выложить пару РоС по теме.

Ageron 26-06-2019 17:14 2876959

Цитата:

Цитата Sub-Zero
"%b%\AppData\Roaming\1C" »

наверное так переменная указывается %%b

но из прежнего цикла вижу только %%a

Vadikan 26-06-2019 19:48 2876972

Цитата:

Цитата greg zakharov
Vadikan, а что, собственно, там объяснять? Если консоль правильно нстроена на вывод юникода, никаких вопросов пользователь не увидит. »

Вот именно, что в варианте с пошиком объяснять ничего не надо вообще.

greg zakharov 26-06-2019 22:16 2876984

Цитата:

Цитата Vadikan
Вот именно, что в варианте с пошиком объяснять ничего не надо вообще.

Смотря о каком именно варианте идет речь, ибо если написать:
Код:

(gp HKLM:\SO*\M*\W*\C*\ProfileList\*).ProfileImagePath
это так же сработает, но, во-первых, далеко не во всех версиях, во-вторых, придется разъяснить человеку несведущему как оно работает и отчего нескольким медленней, нежели ожидается. Про кодировки там и вовсе тема отдельной книги, а конструкции в стиле brainfuck - это для многих попросту непостижимая наука. - Подобного рода полемика алогична, не находите? Проще и короче в pwsh будет решение вида:
Код:

(Get-CimInstance Win32_UserProfile).LocalPath

Iska 27-06-2019 04:29 2877007

Цитата:

Цитата Vadikan
Почему? »

Vadikan, это старая история: Блог GunSmoker-а (переводы): Длинная и печальная история ключа Shell Folders/The long and sad story of the Shell Folders key | The Old New Thing. Microsoft рекомендует пользовать для этого дела WinAPI. В нашем случае мы можем опосредованно пользовать его посредством Wbem. Если бы было уже ну совсем никак, а токмо через реестр — тогда ладно, я бы согласился.

Цитата:

Цитата Vadikan
Ах да, еще в моем варианте кириллическое название учетной записи в консоли читается, в отличие от знаков вопроса с wmic/findstr »

Вот этого не понял. У меня вроде как нормально:
Скрытый текст

Ну, да ладно.

alpap 27-06-2019 08:59 2877026

Цитата:

Цитата Sub-Zero
часть не работает »

сделайте примерно так:
Код:

@echo off
set "skey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
set "v=ProfileImagePath"

for /f "tokens=2*" %%a in ('reg query "%skey%" /s /v "%v%"^|findstr /rc:"^[ ][ ]*"') do call :spath "%%b" "AppData\Roaming\1C" "vrs-cache SICache Config ConfigSave DBNameCache"
pause& exit

:spath
 for /d /r "%~1\%~2" %%A in (*) do (
  for %%a in (%~3) do if /i "%%~nxA"=="%%~a" rd /s /q "%%A"
 )
exit /b

(не забывайте что в "%%b" у вас полный путь, на всякий случай.)

greg zakharov 27-06-2019 14:56 2877071

Код:

@echo off
  setlocal enabledelayedexpansion
    for /f "tokens=2* delims==" %%i in (
      'wmic path win32_userprofile where^
      "not sid like 's-1-5-__'" get localpath /value'
    ) do (
      set "usr=%%~i"&set "usr=!usr:~,-1!\AppData\Roaming\1C"
      for /f "delims=" %%j in ('dir /ad/b/s "!usr!"') do (
        for %%k in (vrs-cache SICache Config ConfigSave DBNameCache) do (
          if /i "%%~nj" equ "%%k" rd /q/s "%%~j"
        )
      )
    )
  endlocal
exit /b


Sub-Zero 01-07-2019 16:03 2877665

Спасибо огромное всем откликнувшимся!!! :up :yahoo:

Цитата:

Цитата alpap
не забывайте что в "%%b" у вас полный путь »

Да помню - полный путь к профилю юзера :)

Sub-Zero 04-02-2020 17:59 2908230

Всем привет!
Снова прошу помощи и поднимаю эту тему. Помимо путей профилей пользователей понадобились еще их имена.
То есть на выходе цикла должно быть соответствующих друг другу 2 переменных: путь профиля + имя пользователя
Если делать через wmic то можно получить SIDы. По ним можно получить имена, а вот можно ли получить пути профилей - не осилил.
Есть конечно еще вариант из путей получать имена - смотреть все что справа до \.

alpap 04-02-2020 21:06 2908248

Цитата:

Цитата Sub-Zero
путь профиля + имя пользователя »

Код:

@echo off
set "skey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
set "v=ProfileImagePath"

for /f "tokens=2*" %%a in ('reg query "%skey%" /s /v "%v%"^|findstr /rc:"^[ ][ ]*"') do call :spath "%%b"
pause& exit

:spath
 echo Путь: %~1, имя: %~n1
exit /b


greg zakharov 04-02-2020 21:46 2908252

При наличии sed:
Код:

reg query "hklm\software\microsoft\windows nt\currentversion\profilelist" /s /v profileimagepath | sed  -nr "s/.*_sz(.*\\([^\\].*))/\2\1/Ip"

Sub-Zero 05-02-2020 11:09 2908307

Друзья, огромное спасибо!!! :yahoo: Все работает. Единственное - исключить бы из отбора 3 системных аккаунта: systemprofile, LocalService и NetworkService и будет вообще огонь.

alpap 05-02-2020 15:09 2908355

на каком-нибудь этапе, сами уже подумайте, как раз будет полезно в коде разобраться когда пойдет что-то не так или захочется очередного апгрейда.
Код:

findstr /v /c:"systemprofile" /c:"LocalService" /c:"NetworkService"

Sub-Zero 05-02-2020 15:51 2908370

Цитата alpap:
на каком-нибудь этапе, сами уже подумайте »
Подумал... в итоге все запустилось как надо. Спасибо большущее!!! :up
Итоговый скрипт:
Код:

@echo off
set "skey=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList"
set "v=ProfileImagePath"
for /f "tokens=2*" %%a in ('reg query "%skey%" /s /v "%v%"^|findstr /rc:"^[ ][ ]*"^|findstr /v /c:"systemprofile" /c:"LocalService" /c:"NetworkService"') do call :spath "%%b"
pause& exit
:spath
echo Путь: %~1, имя: %~n1
)
exit /b


greg zakharov 05-02-2020 16:38 2908374

И опять-таки, с использованием sed:
Код:

reg query "hklm\software\microsoft\windows nt\currentversion\profilelist" /s /v profileimagepath | sed  -nr "/root/!s/.*_sz(.*\\([^\\].*))/\2\1/Ip"


Время: 23:22.

Время: 23:22.
© OSzone.net 2001-