2014-10-27 2 views
0

У меня есть этот запрос на вставку, который неправильно вставлен и действительно раздражает. Я кратко объясню, что я пробовал, и чего я действительно хочу достичь.Powershell - RPC, OBJ Null и -Replace ОШИБКИ в запросе на вставку MySQL

Что мой PS скрипт делает:

  1. пинг каждый компьютер из таблицы базы данных
  2. если пинг успешно, получить имя пользователя вошедшего от компьютера
  3. вставки в таблицу базы данных следующих значений: имя пользователя, имя хоста, онлайн (true/false)

Теперь вот проблемы, которые продолжают возникать.

Проблема 1: Если я использую следующую команду:

$ имя = Get-WMIObject -ComputerName $ АРМ -Класс Win32_ComputerSystem | Select-Object -ExpandProperty Username;

Это вставит значение имени пользователя следующим образом: SUPER/user1, который Хорошо, но я хочу, чтобы избавиться от «SUPER /» и просто держать фактическое имя пользователя «user1» перед вставкой.

Я попытался с помощью одного ниже, но он не работает:

$username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty -replace '^.*\\' Username; 

Команда в задаче 1 даст мне эти две ошибки:

не может обработать аргумент, так как значение аргумента " obj "имеет значение null. Измените значение аргумента «obj» на ненулевое значение.

И

Get-WmiObject: Сервер RPC недоступен.

Как я могу игнорировать эти две ошибки?

Я надеюсь, что кто-то может помочь мне, потому что это действительно раздражает. спасибо заранее всем.

Powershell скрипт:

foreach($pcname in $workstation_list){ 

     $command = $connection.CreateCommand(); 
     $command.Connection = $connection; 
     $command.CommandText = "INSERT INTO workstation_userlogged 
           (username,hostname,online) 
           VALUES (@username,@hostname,@status)"; 

     ### ============================================================= 
     ### values to be assigned as a parameters 
     ### =============================================================   
     $workstation = $pcname;     
     $test_ping = Test-Connection -ComputerName $workstation -Count 1 -ErrorAction SilentlyContinue; 
     $status  = [bool](Test-Connection $workstation -Quiet -Count 1 -ErrorAction SilentlyContinue); 

     #if status is TRUE get username 
     if($test_ping) 
     { 
      $username = Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem | Select-Object -ExpandProperty Username; 
      echo $username; 
      #echo -replace '^.*\\' $username;   

      #if ping succeeds but no user is logged 
      if($username -eq "") 
      { 
       $username = "no user logged"; 
      } 

     } #end if 

     #if ping DOES NOT succeed set username value to NULL and status to FALSE 
     elseif(!$test_ping) 
     { 
      $username = [DBNull]::Value; 
     } 

     ### ============================================================= 
     ### Assign parameters with appropriate values 
     ### ============================================================= 
     $command.Parameters.Add("@username", $username)  | Out-Null 
     $command.Parameters.Add("@hostname", $workstation) | Out-Null 
     $command.Parameters.Add("@status", $status)  | Out-null 
     ### ============================================================= 
     ### Execute command query 
     ### ============================================================= 
     try{ 
      $command.ExecuteNonQuery() | out-null; 
      Write-Host "Successfully inserted in Database"; 
     } 
     catch{ 
      Write-Host "Caught the exception"; 
      Write-Host "$_"; 
     } 

     ### ============================================================= 
     ### clear parameter values 
     ### ============================================================= 
     $command.Dispose() 
     $workstation = ""; 
     $username = ""; 
     $status  = ""; 
     $test_ping = ""; 
    }#end for each loop 

ответ

0

Что касается проблемы 1, попробуйте следующее:

$username = (Get-WMIObject -ComputerName $workstation -Class Win32_ComputerSystem).UserName 
$username = $username.split("\") 
$username = $username[1] 

Проблема 2 происходит из-за проблемы на удаленной машине. Для получения некоторой поддержки отладки посмотрите документацию Microsoft: Technet.

Несмотря на то, что эта статья предназначена для MS Server, большинство ее должно быть применимо и на клиентских машинах.

+0

эй, он сделал INSERT в моем столе отлично. Однако есть 2 ошибки, показывающие как «split», так и «array». Для «split» ** Вы не можете вызывать метод в нулевом выражении ** и для «массива» ** Нельзя индексировать нулевой массив. ** Не могли бы вы объяснить? благодаря! – mario

+0

hmm Я предполагаю, что это происходит, если Get-WmiObject не возвращает объект (возможно, из-за вашей второй проблемы). На данный момент $ username равно $ null, поэтому он разделяется, и следующее будет сбой – Paul

+0

, так как я могу игнорировать ошибки, чтобы сценарий все еще мог работать без его отображения. Спасибо – mario