Войти

Показать полную графическую версию : [решено] Работа с реестром


lox-ness
10-08-2020, 15:42
Доброго времени суток!
Хотелось бы прояснить для себя следующую ситуацию. Необходимо определить путь до папки Desktop у пользователя.
Почему не получается считать значение корректно? Рассматриваемая ветка является же корнем именно из нее получается ветка HKLU

$sid = (Get-ADUser $user).Sid.Value
$HKU = 2147483651
$wmi = Get-WmiObject -List -Namespace "root\default" -ComputerName $PS | Where-Object {$_.Name -eq "StdRegProv"}
$wmi.GetExpandedStringValue($HKU,"$SID\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","desktop").SValue

greg zakharov
10-08-2020, 18:24
Когда цепляетесь к удалённой тачке к тому же с активной сессией пользователя, знать SID необязательно, так как в память среди прочего будет загружен куст реестра HKCU. Иными словами, можно запросить данные из последнего. Например:
using namespace Microsoft.Win32

$target_machine = "zhopka"
try {
$rk = [RegistryKey]::OpenRemoteBaseKey([RegistryHive]::CurrentUser, $target_machine)
$sk = $rk.OpenSubKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders')
$sk.GetValue('Desktop')
}
finally {
if ($sk) {$sk.Dispose()}
if ($rk) {$rk.Dispose()}
}
Насколько помню HKU = -2147483645.

YuS_2
10-08-2020, 18:28
Необходимо определить путь до папки Desktop у пользователя. »
[environment]::getfolderpath('Desktop')

greg zakharov
10-08-2020, 18:32
YuS_2, если обернуть в Invoke-Command, но у оного достаточно побочных эффектов.

lox-ness
10-08-2020, 18:54
Когда цепляетесь к удалённой тачке к тому же с активной сессией пользователя, знать SID необязательно, так как в память среди прочего будет загружен куст реестра HKCU. Иными словами, можно запросить данные из последнего. Например: »

Без sid не будет работать, считывает ветку пользователя от имени которого происходит запуск
с указанием Sid пишет"Невозможно вызвать метод для выражения со значением NULL"

В ходе тестирования выяснили, что с Windows XP считывает ветку как надо, думаю это происходит потому что папка называется "Рабочий стол", а не "Desktop"
И проблема именно в переменной %Userprofile% и как обойти эту проблему ... ????
Если путь до Desktop написан явно, то все хорошо считывает
WinRM у нас запрещен, поэтому вариант с Invoke-Command и [environment]::getfolderpath('Desktop') - не получиться

greg zakharov
10-08-2020, 19:29
считывает ветку пользователя от имени которого происходит запуск
Даже если в системе несколько учёток, не вижу проблемы переписать пример с SID по аналогии.
К слову, можно провернуть очень грязный трюк со счётчиками производительности, но способ палится всеми AV.

lox-ness
11-08-2020, 06:08
Даже если в системе несколько учёток, не вижу проблемы переписать пример с SID по аналогии. »

Вроде выше было написано, что с с указанием Sid пишет"Невозможно вызвать метод для выражения со значением NULL
Не получается получить корректное значение, единственное что получается это через wmi получить путь до профиля пользователя и потом дописать название папки и проверить этот путь
Примерно так

$path_profile = (((Get-WMIObject win32_userprofile -ComputerName $name_ps -filter "SID = '$sid'").LocalPath) -replace ":","$") + "\desktop"
$path_desktop = "\\$name_ps\$path_profile"
if (Test-path $path_desktop) ....


Какой-то костыль выходит

greg zakharov
11-08-2020, 14:36
Вроде выше было написано, что с с указанием Sid пишет"Невозможно вызвать метод для выражения со значением NULLНу дык никто не мешает воспользоваться невиртуальным методом GetType, чтобы понять где в какой переменной что лежит, верно?

lox-ness
11-08-2020, 16:22
Ну дык никто не мешает воспользоваться невиртуальным методом GetType, чтобы понять где в какой переменной что лежит, верно? »
Что-то не могу понять, как к этому случаю прикрутить GetType. Можете по подробнее рассказать.

lox-ness
11-08-2020, 19:08
В проблеме разобрались, все таки как и предполагалось проблема в применении переменной %UserProfile%
ветка .. user Shell Folders содержит тип: REG_EXPAND_SZ - Расширяемая строка данных. Эта строка представляет собой текст, содержащий переменную, которая может быть заменена при вызове со стороны приложения. Именно это и происходит.
Возможно мои суждения ошибочны, но тестирование показывает именно этот вывод
сменили путь на shell folders отрабатывает корректно.




© OSzone.net 2001-2012