none
Скрипт по списку примапленных дисков на удаленном ПК

    Вопрос

  • Добрый день, коллеги!

    Стоит задача, получить данные по сетевым дискам (которые приезжают через GPO), я попробовал выполнить следующую команду:

    Get-WmiObject Win32_MappedLogicalDisk -computerName nsk-w01867 | select Name, ProviderName,FileSystem,@{Name="Total Size";Expression={$_.size / 1GB}}, @{Name="Free Space";Expression={$_.freespace / 1GB}}

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

    Спасибо за любой ответ.

    18 апреля 2018 г. 10:40

Ответы

  • Тогда только из контекста пользователя:

    Invoke-Command remotepc {
    	$user = (Get-WmiObject Win32_ComputerSystem).UserName
    	Remove-Item C:\LogMAP -Force -Recurse -EA 0
    	schtasks.exe /create /TN GetMapDisk /ST 00:00 /RU $user /SC ONCE /TR 'powershell.exe -WindowStyle Hidden -noprofile -nologo -command &{md C:\LogMAP;gwmi win32_mappedlogicaldisk | select DeviceID,ProviderName | Export-Clixml C:\LogMAP\$env:UserName.xml}' /f 2>&1 > $null
    	$null = schtasks.exe /run /TN GetMapDisk
    	$sch = New-Object -ComObject Schedule.Service
    	$sch.Connect()
    	while($sch.GetFolder("\").GetTask("GetMapDisk").State -ne 3) {
    		Start-Sleep -Sec 1
    	}
    	Import-CliXML C:\LogMAP\*.xml
    	Remove-Item C:\LogMAP -Force -Recurse -EA 0
    	$null = schtasks.exe /delete /TN GetMapDisk /f
    }



    • Изменено KazunEditor 18 апреля 2018 г. 13:33
    • Помечено в качестве ответа eclegolas 18 апреля 2018 г. 14:54
    18 апреля 2018 г. 13:19
    Отвечающий
  • Непонятно зачем обычным пользователям удалено получать эту информацию.

    1.

    Get-WmiObject Win32_MappedLogicalDisk -computerName nsk-w01867 - Не выдаст результат для удаленного компьютера, если учетная запись отличается от который выполняется скрипт.

    2. В моем примере, да требуются права администратора,т.к. требуется удаленное подключение и  создание задачи в контексте другого пользователя.

    3. Без прав администратора, требуется значительных затрат для делегирования другому пользователю - https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/31/introduction-to-powershell-endpoints/

    • Помечено в качестве ответа eclegolas 18 апреля 2018 г. 14:54
    18 апреля 2018 г. 14:28
    Отвечающий

Все ответы

  • Добрый день!

    Вы можете использовать Invoke-Command и складывать вывод в сетевую папку

    Import-Module ActiveDirectory
    $computers = Get-ADComputer -Filter {Enabled -eq "True"}
    Foreach ($computer in $computers) {
    	if (Test-Connection $computer.Name -Quiet) {
    		Invoke-Command -ComputerName $computer.Name -ErrorAction Ignore {
                        Get-WmiObject Win32_MappedLogicalDisk | select Name, ProviderName,FileSystem,@{Name="Total Size";Expression={$_.size / 1GB}}, @{Name="Free Space";Expression={$_.freespace / 1GB}}
    		}
    	}
    }


    • Изменено Sergey Ya 18 апреля 2018 г. 10:54
    18 апреля 2018 г. 10:54
  • Добрый день, Sergey Ya!

    К сожалению не работает, вывод пустой, а по факту на самом ПК у пользователя полно дисков.

    18 апреля 2018 г. 10:59
  • Как насчет поставить в логон-скрипт что-то из Get-PSDrive с выводом ответа в текстовый документ?
    18 апреля 2018 г. 11:08
  • Как раз от логон-скриптов избавляемся, у нас в компании используется Landesk, в нем есть функционал console extender, в который можно добавлять команды\скрипты, которые в последствии появляются в контекстном меню в консоли Landesk. Это удобно, нажал ПКМ на компьютере пользователя и увидел, подключены диски или нет. Да и без использования Landesk, через posh разве нельзя выполнять такие действия, к примеру я просто хочу выполнить аудит?

    • Изменено eclegolas 18 апреля 2018 г. 11:17 пояснение 2
    18 апреля 2018 г. 11:13
  • Добрый день!

    Вы можете использовать Invoke-Command и складывать вывод в сетевую папку

    Import-Module ActiveDirectory
    $computers = Get-ADComputer -Filter {Enabled -eq "True"}
    Foreach ($computer in $computers) {
    	if (Test-Connection $computer.Name -Quiet) {
    		Invoke-Command -ComputerName $computer.Name -ErrorAction Ignore {
                        Get-WmiObject Win32_MappedLogicalDisk | select Name, ProviderName,FileSystem,@{Name="Total Size";Expression={$_.size / 1GB}}, @{Name="Free Space";Expression={$_.freespace / 1GB}}
    		}
    	}
    }

    если диски мапятся политикой пользователя (скорее всего это так), то этот скрипт не даст результата, так как у разных пользователей будут разные диски - у админа (от которого запускается скрипт) небудет никаких

    The opinion expressed by me is not an official position of Microsoft

    18 апреля 2018 г. 11:30
    Модератор
  • Как раз от логон-скриптов избавляемся, у нас в компании используется Landesk, в нем есть функционал console extender, в который можно добавлять команды\скрипты, которые в последствии появляются в контекстном меню в консоли Landesk. Это удобно, нажал ПКМ на компьютере пользователя и увидел, подключены диски или нет. Да и без использования Landesk, через posh разве нельзя выполнять такие действия, к примеру я просто хочу выполнить аудит?

    Все можно, но диски примаплены в окружении пользователя и дергать нужно именно из под него. ЕМНИП примапленные диски живут в ветке реестра HKCU. Если это так, то от туда их можно выгрести без особых проблем


    The opinion expressed by me is not an official position of Microsoft

    18 апреля 2018 г. 11:33
    Модератор
  • Invoke-Command remotepc {
    	Get-ItemProperty registry::HKEY_USERS\S-1-5-21-*[0-9]\Network\* | Select PSChildName,RemotePath
    }

    Или без буквы:

    Get-Item registry::HKEY_USERS\S-1-5-21-*[0-9]\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\##* | Foreach {$_.PSChildName.replace("#","\")}


    • Изменено KazunEditor 18 апреля 2018 г. 12:02
    18 апреля 2018 г. 11:35
    Отвечающий
  • Kazun, спасибо за данный пример, но он вывел только диск примапленный вручную, остальные не показал.

    

    18 апреля 2018 г. 12:24
  • Это диск не вручную, а у кого установлен флаг Persistent(если через GPP - то галочка reconnect).

    Эта строчка,что выводит:

    Get-Item registry::HKEY_USERS\S-1-5-21-*[0-9]\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\##*


    • Изменено KazunEditor 18 апреля 2018 г. 12:30
    18 апреля 2018 г. 12:29
    Отвечающий
  • Эта строка выводит следующее:

    UNC пути, причем, последних 3-х нет у нас уже давно.

    18 апреля 2018 г. 12:45
  • Тогда только из контекста пользователя:

    Invoke-Command remotepc {
    	$user = (Get-WmiObject Win32_ComputerSystem).UserName
    	Remove-Item C:\LogMAP -Force -Recurse -EA 0
    	schtasks.exe /create /TN GetMapDisk /ST 00:00 /RU $user /SC ONCE /TR 'powershell.exe -WindowStyle Hidden -noprofile -nologo -command &{md C:\LogMAP;gwmi win32_mappedlogicaldisk | select DeviceID,ProviderName | Export-Clixml C:\LogMAP\$env:UserName.xml}' /f 2>&1 > $null
    	$null = schtasks.exe /run /TN GetMapDisk
    	$sch = New-Object -ComObject Schedule.Service
    	$sch.Connect()
    	while($sch.GetFolder("\").GetTask("GetMapDisk").State -ne 3) {
    		Start-Sleep -Sec 1
    	}
    	Import-CliXML C:\LogMAP\*.xml
    	Remove-Item C:\LogMAP -Force -Recurse -EA 0
    	$null = schtasks.exe /delete /TN GetMapDisk /f
    }



    • Изменено KazunEditor 18 апреля 2018 г. 13:33
    • Помечено в качестве ответа eclegolas 18 апреля 2018 г. 14:54
    18 апреля 2018 г. 13:19
    Отвечающий
  • Эта строка выводит следующее:

    UNC пути, причем, последних 3-х нет у нас уже давно.

    а владелец сида еще работает в компании?

    The opinion expressed by me is not an official position of Microsoft

    18 апреля 2018 г. 13:25
    Модератор
  • Vector BCO

    Да работает.

    Kazun

    Ситуация та же, если есть админские права всё вывел, но без выдал ошибку:

    Ћ˜€ЃЉЂ: ЌҐ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© д ©«.
        + CategoryInfo          : NotSpecified: (Ћ˜€ЃЉЂ: ЌҐ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© д ©«.:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
        + PSComputerName        : имя-пк
     
    NotSpecified: (:) [], RemoteException
    Не удается найти указанный файл. (Исключение из HRESULT: 0x80070002)
        + CategoryInfo          : OperationStopped: (:) [], FileNotFoundException
        + FullyQualifiedErrorId : System.IO.FileNotFoundException
        + PSComputerName        : имя-пк
     
    Путь содержит недопустимые знаки.
        + CategoryInfo          : OpenError: (:) [Import-Clixml], ArgumentException
        + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.ImportClixmlCommand
        + PSComputerName        : имя-пк
     
    Ћ˜€ЃЉЂ: ЌҐ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© д ©«.
        + CategoryInfo          : NotSpecified: (Ћ˜€ЃЉЂ: ЌҐ г¤ Ґвбп ­ ©вЁ гЄ § ­­л© д ©«.:String) [], RemoteException
        + FullyQualifiedErrorId : NativeCommandError
        + PSComputerName        : имя-пк
    NotSpecified: (:) [], RemoteException

    Если запускать это непосредсвенно находясь за Пк пользователя под его сеансом, он всё выводит корректно.

    18 апреля 2018 г. 14:13
  • Непонятно зачем обычным пользователям удалено получать эту информацию.

    1.

    Get-WmiObject Win32_MappedLogicalDisk -computerName nsk-w01867 - Не выдаст результат для удаленного компьютера, если учетная запись отличается от который выполняется скрипт.

    2. В моем примере, да требуются права администратора,т.к. требуется удаленное подключение и  создание задачи в контексте другого пользователя.

    3. Без прав администратора, требуется значительных затрат для делегирования другому пользователю - https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/31/introduction-to-powershell-endpoints/

    • Помечено в качестве ответа eclegolas 18 апреля 2018 г. 14:54
    18 апреля 2018 г. 14:28
    Отвечающий
  • Тогда думаю вопрос исчерпал себя, спасибо большое!
    18 апреля 2018 г. 14:54