应用程序在Windows 7中运行,但在Windows 10中不运行

时间:2016-01-07 15:30:12

标签: powershell windows-10

我已经创建了一个用于备份和恢复计算机的应用程序。我还允许通过使用自定义Profile.ps1文件来修改ADObjects。该应用程序在ISE中正常运行,没有错误,并且在Windows 7中正常运行没有错误。但是,当我尝试在新映像的Windows 10计算机上运行它时,我的所有对象属性都出现“无法找到属性”错误。

当我填充组合框时,我可以阅读所有属性。只有在提交表单时才会出现此错误。我将附上我遇到问题的其中一种表格。它在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"
  }
}

1 个答案:

答案 0 :(得分:0)

这是你的罪魁祸首(从我所看到的):

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

您将计算机对象分配给一个scriptblock中的变量$computerObject,并尝试在另一个scriptblock中更改其中一个属性。但是,为了能够在脚本块之间共享变量,您需要将其设置为全局变量,否则您将拥有两个单独的本地变量,这些变量彼此无关。

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

BTW,我怀疑这在Windows 7中是否有效,因为它在我的Windows 7测试盒上出现了同样的错误。