2016-01-07 2 views
-2

Я создал приложение для резервного копирования и восстановления компьютеров. Я также допускаю модификацию ADObjects с помощью пользовательского файла Profile.ps1. Приложение отлично работает в ISE без ошибок и корректно работает с ошибками в Windows 7. Однако, когда я пытаюсь запустить его на недавно созданной машине с Windows 10, я получаю ошибки «Свойства не могут быть найдены» во всех моих объектных свойствах.Приложение работает в Windows 7, но не в Windows 10

Дело в том, что я могу читать все свойства, когда я заполняю поле со списком. Ошибка возникает только при отправке формы. Я приложу 1 из форм, с которыми у меня возникла проблема. Снова он отлично работает в Windows 7, но не в Windows 10.

Возможно, это проблема с обновлениями Microsoft?

Также, да, я устанавливаю Set-ExecutionPolicy -Scope Process -ExecutionPolicy Unrestricted.

Сообщение об ошибке:

The property 'company' cannot be found on this object. Verify that the 
property exist and can be set. 
+ $CO.company = $company 
+ Categoryinfo :InvalidOperation: (:) [] RuntimeExeption

Код:

. \\iotsdsp01pw\installs$\MoveToOU\PcDeployment\Profile.ps1 

#region Validation Functions 
function Validate-IsEmail ([string]$Email) { 
    return $Email -match "^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$" 
} 

function Validate-IsURL ([string]$Url) { 
    if ($Url -eq $null) { 
    return $false 
    } 

    return $Url -match "^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$" 
} 

function Validate-IsName ([string]$Name, [int]$MaxLength) { 
    if ($MaxLength -eq $null -or $MaxLength -le 0) { 
    #Set default length to 40 
    $MaxLength = 40 
    } 

    return $Name -match "^[a-zA-Z''-'\s]{1,$MaxLength}$" 
} 

function Validate-IsIP ([string]$IP) { 
    return $IP -match "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" 
} 

function Validate-IsEmptyTrim ([string]$Text) { 
    if ($text -eq $null -or $text.Trim().Length -eq 0) { 
    return $true 
    } 

    return $false 
} 

function Validate-IsEmpty ([string]$Text) { 
    return [string]::IsNullOrEmpty($Text) 
} 

function Validate-IsDate ([string]$Date) { 
    return [DateTime]::TryParse($Date, [ref](New-Object System.DateTime)) 
} 
#endregion 

$No_Load = { 
    $NewForm.Close() 
    #Initialize variables 
    $dateTime = Get-Date -Format G 
    $userName = (Get-WmiObject -Class Win32_ComputerSystem -Property UserName).UserName 
    $computerName = $env:computername 

    #Varables for display 
    $distinguishedName = (Get-dn computer cn $computerName) 
    $computerObject = (Get-ADObject $distinguishedName) 
    $organizationalUnit = (Get-ADObject "OU=Agencies, DC=state, DC=in, DC=us") 

    #Initialize Form Controls 
    $lblUserNameNewNo.Text = $userName 
    $lblComputerNameNewNo.Text = $computerName 
    $lblPhysicalLocationNewNo.Text = $computerObject.location 
    $txtBillingCodeNewNo.Text = $computerObject.departmentNumber 
    $comboboxAccountTypeNewNo.Text = $computerObject.extensionAttribute15 
    $comboboxOrganizationalUnitNewNo.Text = $computerObject.company 
    Load-ComboBox -ComboBox $comboboxOrganizationalUnitNewNo ($organizationalUnit.children | %{ $_.OU }) 
} 

#region Control Helper Functions 
function Load-ComboBox { 
    Param (
    [ValidateNotNull()] 
    [Parameter(Mandatory = $true)] 
    [System.Windows.Forms.ComboBox]$ComboBox, 
    [ValidateNotNull()] 
    [Parameter(Mandatory = $true)] 
    $Items, 
    [Parameter(Mandatory = $false)] 
    [string]$DisplayMember, 
    [switch]$Append 
) 

    if (-not $Append) { 
    $ComboBox.Items.Clear() 
    } 

    if ($Items -is [Object[]]) { 
    $ComboBox.Items.AddRange($Items) 
    } elseif ($Items -is [Array]) { 
    $ComboBox.BeginUpdate() 
    foreach ($obj in $Items) { 
     $ComboBox.Items.Add($obj) 
    } 
    $ComboBox.EndUpdate() 
    } else { 
    $ComboBox.Items.Add($Items) 
    } 

    $ComboBox.DisplayMember = $DisplayMember 
} 

#Validation 
function ParameterValidate { 
    Param (
    [Parameter(Mandatory = $true)] 
    [ValidateNotNull()] 
    [ValidateLength(1, 10)] 
    [String]$Text 
) 
    return $true 
} 

$comboboxOrganizationalUnitNewNo_Validating = [System.ComponentModel.CancelEventHandler]{ 
    #Check if the Name field is empty 
    $result = Validate-IsEmptyTrim $comboboxOrganizationalUnitNewNo.Text 
    if ($result -eq $true) { 
    #Mark a failure only if the Validation failed 
    $script:ValidationFailed = $true 
    #Display an error message 
    $errorprovider1.SetError($comboboxOrganizationalUnitNewNo, "Please select agency."); 
    } else { 
    #Clear the error message 
    $errorprovider1.SetError($comboboxOrganizationalUnitNewNo, ""); 
    } 
} 

$txtBillingCodeNewNo_Validating = [System.ComponentModel.CancelEventHandler]{ 
    #Check if the Name field is empty 
    $result = Validate-IsEmptyTrim $txtBillingCodeNewNo.Text 
    if ($result -eq $true) { 
    #Mark a failure only if the Validation failed 
    $script:ValidationFailed = $true 
    #Display an error message 
    $errorprovider1.SetError($txtBillingCodeNewNo, "Please enter billing code."); 
    } else { 
    #Clear the error message 
    $errorprovider1.SetError($txtBillingCodeNewNo, ""); 
    } 
} 

$comboboxAccountTypeNewNo_Validating = [System.ComponentModel.CancelEventHandler]{ 
    $result = Validate-IsEmptyTrim $comboboxAccountTypeNewNo.Text 
    if ($result -eq $true) { 
    #Mark a failure only if the Validation failed 
    $script:ValidationFailed = $true 
    #Display an error message 
    $errorprovider1.SetError($comboboxAccountTypeNewNo, "Please enter agency type."); 
    } else { 
    #Clear the error message 
    $errorprovider1.SetError($comboboxAccountTypeNewNo, ""); 
    } 
} 

$control_Validated = { 
    #Pass the calling control and clear error message 
    $errorprovider1.SetError($this, ""); 
} 

$No_FormClosing = [System.Windows.Forms.FormClosingEventHandler]{ 
    #Event Argument: $_ = [System.Windows.Forms.FormClosingEventArgs] 
    #Validate only on OK Button 
    if ($No.DialogResult -eq "OK") { 
    #Init the Validation Failed Variable 
    $script:ValidationFailed = $false 
    #Validate the Child Control and Cancel if any fail 
    $No.ValidateChildren() 
    #Cancel if Validation Failed 
    $_.Cancel = $script:ValidationFailed 
    } 
} 

#Events 
$buttonColor_Click = { 
    #TODO: Place custom script here 
    $colordialog1.ShowDialog() 
} 

$linklblViewListNewNo_LinkClicked = [System.Windows.Forms.LinkLabelLinkClickedEventHandler]{ 
    Start-Process "http://billingcodes.iot/" 
} 

$btnSubmitNewNo_Click = { 
    #TODO: Place custom script here 
    $company = $comboboxOrganizationalUnitNewNo.Text 
    $departmentNumber = $txtBillingCodeNewNo.Text 
    $accountType = $comboboxAccountTypeNewNo.Text 

    if ($accountType -eq "Seat") { 
    $accountType = " " 
    } 

    #Varables for Set-ADObject 
    $computerObject.company = $company 
    $computerObject.departmentNumber = $departmentNumber 
    $computerObject.extensionAttribute15 = $accountType 

    try { 
    $computerObject.SetInfo() 
    [Environment]::Exit(1) 
    } catch { 
    $labelDialogRedNewNo.Text = "AD computer object not found" 
    } 
} 
+2

Я укажу, что обновление W10 неделя или два назад сломало командлеты AD на моей машине. Я не проводил исследований, чтобы узнать, была ли это распространенная проблема или нет, я только что ее исправил. – EBGreen

+0

Извините, я не ответил, но там действительно нет кода для публикации. приложение отлично работает в W7, но не работает в W10. Я читаю свойства объекта штрафа для выходов. Но когда я пытаюсь изменить их на Submit Click, я получаю следующую ошибку: Пример – Irwin

+1

Программа, которая запускается без кода ... amazing ... – EBGreen

ответ

0

Это ваш виновник (от того, что я могу видеть):

$No_Load = { 
    ... 
    $computerObject = (Get-ADObject $distinguishedName) 
    ... 
} 
... 
$btnSubmitNewNo_Click = { 
    ... 
    $computerObject.company = $company 
    ... 
} 

присваивается компьютерный объект переменной $computerObject в одном скриптблоке и попытайтесь изменить одно из своих свойств в другом скриптблоке. Однако, чтобы иметь возможность использовать переменную между скриптблоками, вам нужно сделать переменную global, в противном случае у вас есть две отдельные переменные , которые ничего не знают друг о друге.

$No_Load = { 
    ... 
    $global:computerObject = Get-ADObject $distinguishedName 
    ... 
} 
... 
$btnSubmitNewNo_Click = { 
    ... 
    $global:computerObject.company = $company 
    ... 
} 

Кстати, я сомневаюсь, что это когда-либо работал в Windows,   7, так как он не с той же ошибкой в ​​моей ОС Windows 7   тест поле.

Смежные вопросы