Компьютерный форум 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=346094)

lox-ness 10-08-2020 15:42 2930679

Работа с реестром
 
Доброго времени суток!
Хотелось бы прояснить для себя следующую ситуацию. Необходимо определить путь до папки 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 2930702

Когда цепляетесь к удалённой тачке к тому же с активной сессией пользователя, знать 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 2930703

Цитата:

Цитата lox-ness
Необходимо определить путь до папки Desktop у пользователя. »

Код:

[environment]::getfolderpath('Desktop')

greg zakharov 10-08-2020 18:32 2930705

YuS_2, если обернуть в Invoke-Command, но у оного достаточно побочных эффектов.

lox-ness 10-08-2020 18:54 2930707

Цитата:

Цитата greg zakharov
Когда цепляетесь к удалённой тачке к тому же с активной сессией пользователя, знать SID необязательно, так как в память среди прочего будет загружен куст реестра HKCU. Иными словами, можно запросить данные из последнего. Например: »

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

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

greg zakharov 10-08-2020 19:29 2930711

Цитата:

Цитата lox-ness
считывает ветку пользователя от имени которого происходит запуск

Даже если в системе несколько учёток, не вижу проблемы переписать пример с SID по аналогии.
К слову, можно провернуть очень грязный трюк со счётчиками производительности, но способ палится всеми AV.

lox-ness 11-08-2020 06:08 2930741

Цитата:

Цитата greg zakharov
Даже если в системе несколько учёток, не вижу проблемы переписать пример с 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 2930810

Цитата:

Цитата lox-ness
Вроде выше было написано, что с с указанием Sid пишет"Невозможно вызвать метод для выражения со значением NULL

Ну дык никто не мешает воспользоваться невиртуальным методом GetType, чтобы понять где в какой переменной что лежит, верно?

lox-ness 11-08-2020 16:22 2930841

Цитата:

Цитата greg zakharov
Ну дык никто не мешает воспользоваться невиртуальным методом GetType, чтобы понять где в какой переменной что лежит, верно? »

Что-то не могу понять, как к этому случаю прикрутить GetType. Можете по подробнее рассказать.

lox-ness 11-08-2020 19:08 2930859

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


Время: 20:53.

Время: 20:53.
© OSzone.net 2001-