Вывод путей профилей пользователей компьютера
Приветствую! Есть скрипт который выводит пути всех профилей пользователей компьютера, но выводит их с пропусками строк, поскольку сама команда 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
|
Код:
@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
|
Спасибо огромное!!! :yahoo:
|
greg zakharov |
24-06-2019 20:07 2876703 |
alpap, то же, но с малым количеством телодвижений:
Код:
wmic path win32_userprofile get localpath | findstr /vric:"localpath"
|
greg zakharov, для чистоты количество телодвижений таки нужно будет увеличить двойным разбором.
|
Зачем все эти 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 также далеко не все можно отнести к понятию профиля.
|
greg zakharov, Вы о чём-то другом. Я об этом:
Vadikan, тогда уж и брать не реестр, а Wbem, как указал коллега greg zakharov.
|
greg zakharov |
25-06-2019 17:46 2876814 |
Iska, баг Far'а должен сообщить по вашему о чем-то сакральном?
|
Цитата:
Цитата greg zakharov
баг Far'а должен сообщить по вашему о чем-то сакральном? »
|
Это не баг Far-а, это таки баг wmic (вернее даже пары wmic|findstr), там лишние символы перевода каретки "\r" (0x0D), да и кучка конечных пробелов тоже не добавляет дополнительного ощущения счастья. :)
|
greg zakharov |
25-06-2019 18:44 2876818 |
YuS_2, увы нет. Во-первых, такого у wmic не наблюдаю ни в одной из систем, к которым у меня имеется доступ, во-вторых, это не похоже на символ возврата каретки, скорее попытка вернуть буфер целиком (к слову, неплохой вектор для атаки).
|
Цитата:
Цитата greg zakharov
Во-первых, такого у wmic не наблюдаю ни в одной из систем »
|
отдельно у wmic - нет, у findstr - тоже нет, а вот именно в таком сочетании:
Код:
wmic path win32_userprofile get localpath | findstr /vric:"localpath" >out.txt

|
greg zakharov, так выглядит результат автоперевода перевода из юникод-вывода wmic.exe в OEM при подобных перенаправлениях. Всегда было так.
|
Цитата:
Цитата Iska
Vadikan, тогда уж и брать не реестр, а Wbem, как указал коллега greg zakharov. »
|
Почему? Обе команды выводят одни и те же пути, только в моем варианте без лишнего перевода каретки и прочего мусора.
Ах да, еще в моем варианте кириллическое название учетной записи в консоли читается, в отличие от знаков вопроса с wmic/findstr (не тратьте время на объяснения, как с этим справляться).
|
Коллеги, помогите пожалуйста еще с одним действом... Все по той же теме:
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. Жаль, что правила форума не позволяют мне выложить пару РоС по теме.
|
Цитата:
Цитата Sub-Zero
"%b%\AppData\Roaming\1C" »
|
наверное так переменная указывается %%b
но из прежнего цикла вижу только %%a
|
Цитата:
Цитата 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
|
сделайте примерно так:
Код:
@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
|
Спасибо огромное всем откликнувшимся!!! :up :yahoo:
Цитата:
Цитата alpap
не забывайте что в "%%b" у вас полный путь »
|
Да помню - полный путь к профилю юзера :)
|
Всем привет!
Снова прошу помощи и поднимаю эту тему. Помимо путей профилей пользователей понадобились еще их имена.
То есть на выходе цикла должно быть соответствующих друг другу 2 переменных: путь профиля + имя пользователя
Если делать через wmic то можно получить SIDы. По ним можно получить имена, а вот можно ли получить пути профилей - не осилил.
Есть конечно еще вариант из путей получать имена - смотреть все что справа до \.
|
Цитата:
Цитата 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"
|
Друзья, огромное спасибо!!! :yahoo: Все работает. Единственное - исключить бы из отбора 3 системных аккаунта: systemprofile, LocalService и NetworkService и будет вообще огонь.
|
на каком-нибудь этапе, сами уже подумайте, как раз будет полезно в коде разобраться когда пойдет что-то не так или захочется очередного апгрейда.
Код:
findstr /v /c:"systemprofile" /c:"LocalService" /c:"NetworkService"
|
Цитата 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.
© OSzone.net 2001-