Как устранить неполадки Get-WmiObject: доступ запрещен.?

У меня есть два рабочих скрипта powershell. Вы бы вызвали script1.ps1 с помощью:

.\script1.ps1 "sender-ip=10.10.10.10"

И скрипт должен возвращать userId=DOMAIN/UserId. Первый скрипт:

#script1.ps1

$abc = $args
$startInfo = $NULL
$process = $NULL
$standardOut = $NULL

<#Previously created password file in C:\Script\cred.txt, read-host -assecurestring | convertfrom-securestring | out-file C:\Script\cred.txt#>
$password = get-content C:\Script\cred.txt | convertto-securestring

$startInfo = New-Object System.Diagnostics.ProcessStartInfo
$startInfo.FileName = "powershell.exe"
$startInfo.Arguments = "C:\script\script2.ps1 " + $abc

$startInfo.RedirectStandardOutput = $true
$startInfo.UseShellExecute = $false
$startInfo.CreateNoWindow = $false
$startInfo.Username = "Username"
$startInfo.Domain = "DOMAIN"
$startInfo.Password = $password 

$process = New-Object System.Diagnostics.Process
$process.StartInfo = $startInfo
$process.Start() | Out-Null
$standardOut = $process.StandardOutput.ReadToEnd()
$process.WaitForExit()

# $standardOut should contain the results of "C:\script\script1.ps1"
$standardOut 

А это весь рабочий скрипт2.ps1

#script2.ps1

$line_array = @()
$multi_array = @()
[hashtable]$my_hash = @{}
$Sender_IP = $NULL
$Win32OS = $NULL
$Build = $NULL
$LastUser = $NULL
$UserSID = $NULL
$userID=$NULL
$output = $NULL


foreach ($i in $args){
   $line_array+= $i.split(" ")
}

foreach ($j in $line_array){
    $multi_array += ,@($j.split("="))
}

foreach ($k in $multi_array){
    $my_hash.add($k[0],$k[1])
}

$Sender_IP = $my_hash.Get_Item("sender-ip")


<#Gather information on the computer corresponding to $Sender_IP#>

$Win32OS = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $Sender_IP 


<#Determine the build number#>
$Build = $Win32OS.BuildNumber


<#Running Windows Vista with SP1 and later, i.e. $Build is greater than or equal to 6001#>
if($Build -ge 6001){
    $Win32User = Get-WmiObject -Class Win32_UserProfile -ComputerName $Sender_IP
    $Win32User = $Win32User | Sort-Object -Property LastUseTime -Descending
    $LastUser = $Win32User | Select-Object -First 1
    $UserSID = New-Object System.Security.Principal.SecurityIdentifier($LastUser.SID)
    $userId = $UserSID.Translate([System.Security.Principal.NTAccount])
    $userId = $userId.Value
}


<#Running Windows Vista without SP1 and earlier, i.e $Build is less than or equal to 6000#>
elseif ($Build -le 6000){
    $SysDrv = $Win32OS.SystemDrive
    $SysDrv = $SysDrv.Replace(":","$")
    $ProfDrv = "\\" + $Sender_IP + "\" + $SysDrv
    $ProfLoc = Join-Path -Path $ProfDrv -ChildPath "Documents and Settings"
    $Profiles = Get-ChildItem -Path $ProfLoc
    $LastProf = $Profiles | ForEach-Object -Process {$_.GetFiles("ntuser.dat.LOG")}
    $LastProf = $LastProf | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 1
    $userId = $LastProf.DirectoryName.Replace("$ProfLoc","").Trim("\").ToUpper()
}

else{
    $userId = "Unknown/UserID"
}

if ($userId -ne $NULL){
    $output = "userId=" + $userId
}
elseif ($userID -eq $NULL)
{
    $userId = "Unknown/UserID"
    $output = "userId=" + $userId
}


$output.replace("\","/") 

Вот моя проблема. На большинстве IP-адресов в нашем домене он возвращает:

Get-WmiObject : Доступ запрещен. (Исключение из HRESULT: 0x80070005 (E_ACCESS DENIED))

Я исследовал это и get-wmiobject win32_process - имя_компьютера получает ошибку «Доступ запрещен», код 0x80070005 рекомендует предоставить учетной записи с повышенными правами разрешение на запуск WMI во всем домене.

И эта статья, http://technet.microsoft.com/en-us/library/cc787533(v=ws.10).aspx объясняет, как это сделать.

Но убедить команду, отвечающую за домен, предоставить разрешения WMI этой учетной записи с повышенными правами, будет непросто. Кроме того, сценарий может вернуть UserId для некоторых IP-адресов в домене.

Есть ли другой способ решить эту проблему? Что я должен исследовать в Google?


person Glowie    schedule 03.09.2013    source источник


Ответы (1)


Рассматривали ли вы возможность использования Invoke-Command и удаленного выполнения сценария2 с помощью Удаленное взаимодействие PowerShell?

Ваш удаленный сценарий может быть выполнен с использованием альтернативных учетных данных, возможно, вам повезет убедить свою группу безопасности включить удаленное взаимодействие PowerShell, а не WMI. Ваши wmi-запросы при запуске с помощью команды invoke будут локальными для машины, поэтому у них больше шансов работать, а также избегается необходимость чтения буфера стандартного вывода.

Для начала попробуйте Enter-PSSession, так как это позволит вам быстро определить, сколько работы необходимо, чтобы PS Remoting заработал в вашей среде.

В будущем вы, возможно, захотите настроить таргетинг на несколько компьютеров одновременно, и в этом случае PS Remoting и Start -Работа была бы полезна.

person David Martin    schedule 03.09.2013
comment
К сожалению, Enter-PSSession у меня не работает :-( (1)Есть некоторые IP-адреса, для которых скрипт смог получить имя пользователя, но когда я использую Enter-PSSession с именем компьютера соответствующего IP-адреса, Я продолжаю получать сообщение об ошибке. (2) Кроме того, Enter-PSSession принимает только имя компьютера, а не IP-адрес. IP-адрес - это ввод, с которым мы работаем .... - person Glowie; 03.09.2013
comment
См. здесь для использования Enter-PSSession с IP-адресом: адрес в качестве цели"> stackoverflow.com/questions/6587426/ - person David Martin; 03.09.2013