Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
stefan_schnell
Active Contributor
I presented here the possibility to use NCo with Microsofts scripting language PowerShell. Here now examples how to use NCo with PowerShell 5 and the new classes language feature. You can find more information about classes in PowerShell here.

1st example - Ping:
#-Begin-----------------------------------------------------------------

<#
.Synopsis
Calls PING of an SAP system.
.Description
Calls the function module RFC_PING and the build-in function
Ping of the .NET connector.
#>

#-Function Get-Destination--------------------------------------------
Function Get-Destination($cfgParams) {
If (("SAP.Middleware.Connector.RfcDestinationManager" -as [type]) -ne $null){
Return [SAP.Middleware.Connector.RfcDestinationManager]::GetDestination($cfgParams)
}
}

#-Class NCo-----------------------------------------------------------
Class NCo {

#-Constructor-----------------------------------------------------
NCo() {

[String]$ScriptDir = $PSScriptRoot

If ([Environment]::Is64BitProcess) {
[String]$Path = $ScriptDir + "\x64\"
}
Else {
[String]$Path = $ScriptDir + "\x86\"
}

[String]$File = $Path + "sapnco.dll"
Add-Type -Path $File
[String]$File = $Path + "sapnco_utils.dll"
Add-Type -Path $File

}

#-Method GetDestination-------------------------------------------
Hidden [Object]GetDestination() {

#-Verbindungsparamter-----------------------------------------
$cfgParams = `
New-Object SAP.Middleware.Connector.RfcConfigParameters
$cfgParams.Add($cfgParams::Name, "TEST")
$cfgParams.Add($cfgParams::AppServerHost, "ABAP")
$cfgParams.Add($cfgParams::SystemNumber, "00")
$cfgParams.Add($cfgParams::Client, "001")
$cfgParams.Add($cfgParams::User, "BCUSER")

$SecPasswd = Read-Host -Prompt "Passwort" -AsSecureString
$ptrPasswd = `
[Runtime.InteropServices.Marshal]::SecureStringToBStr($SecPasswd)
$Passwd = `
[Runtime.InteropServices.Marshal]::PtrToStringBStr($ptrPasswd)
$cfgParams.Add($cfgParams::Password, $Passwd)

Return Get-Destination($cfgParams)

}

#-Method ExecutePing----------------------------------------------
ExecutePing() {

$destination = $This.GetDestination()

#-Metadata----------------------------------------------------
$rfcFunction = `
$destination.Repository.CreateFunction("RFC_PING")

#-Variant 1: Call function module-----------------------------
Try {
$rfcFunction.Invoke($destination)
Write-Host "Ping successful"
}
Catch {
Write-Host "Exception" $_.Exception.Message "occured"
}

#-Variant 2: Call build-in function---------------------------
Try {
$destination.Ping()
Write-Host "Ping successful"
}
Catch {
Write-Host "Exception" $_.Exception.Message "occured"
}

}

}

#-Sub Main------------------------------------------------------------
Function Main () {
$NCo = [NCo]::new()
$NCo.ExecutePing()
}

#-Main----------------------------------------------------------------
If ($PSVersionTable.PSVersion.Major -ge 5) {
Main
}

#-End-------------------------------------------------------------------

2nd example - RFC_SYSTEM_INFO:
#-Begin-----------------------------------------------------------------

<#
.Synopsis
Calls RFC_SYSTEM_INFO of an SAP system.
.Description
Calls the function module RFC_SYSTEM_INFO and writes the result
on the screen.
#>

#-Function Get-Destination--------------------------------------------
Function Get-Destination($cfgParams) {
If (("SAP.Middleware.Connector.RfcDestinationManager" -as [type]) -ne $null){
Return [SAP.Middleware.Connector.RfcDestinationManager]::GetDestination($cfgParams)
}
}

#-Class NCo-----------------------------------------------------------
Class NCo {

#-Constructor-----------------------------------------------------
NCo() {

[String]$ScriptDir = $PSScriptRoot

If ([Environment]::Is64BitProcess) {
[String]$Path = $ScriptDir + "\x64\"
}
Else {
[String]$Path = $ScriptDir + "\x86\"
}

[String]$File = $Path + "sapnco.dll"
Add-Type -Path $File
[String]$File = $Path + "sapnco_utils.dll"
Add-Type -Path $File

}

#-Method GetDestination-------------------------------------------
Hidden [Object]GetDestination() {

#-Verbindungsparamter-----------------------------------------
$cfgParams = `
New-Object SAP.Middleware.Connector.RfcConfigParameters
$cfgParams.Add($cfgParams::Name, "TEST")
$cfgParams.Add($cfgParams::AppServerHost, "ABAP")
$cfgParams.Add($cfgParams::SystemNumber, "00")
$cfgParams.Add($cfgParams::Client, "001")
$cfgParams.Add($cfgParams::User, "BCUSER")

$SecPasswd = Read-Host -Prompt "Passwort" -AsSecureString
$ptrPasswd = `
[Runtime.InteropServices.Marshal]::SecureStringToBStr($SecPasswd)
$Passwd = `
[Runtime.InteropServices.Marshal]::PtrToStringBStr($ptrPasswd)
$cfgParams.Add($cfgParams::Password, $Passwd)

Return Get-Destination($cfgParams)

}

#-Method GetSystemInfo--------------------------------------------
GetSystemInfo() {

$destination = $This.GetDestination()

#-Metadata----------------------------------------------------
$rfcFunction = `
$destination.Repository.CreateFunction("RFC_SYSTEM_INFO")

#-Call function module----------------------------------------
Try {
$rfcFunction.Invoke($destination)

$Export = $rfcFunction.GetStructure("RFCSI_EXPORT")

#-Get information-----------------------------------------
Write-Host $Export.GetValue("RFCHOST")
Write-Host $Export.GetValue("RFCSYSID")
Write-Host $Export.GetValue("RFCDBHOST")
Write-Host $Export.GetValue("RFCDBSYS")

}
Catch {
Write-Host "Exception" $_.Exception.Message "occured"
}

}

}

#-Sub Main------------------------------------------------------------
Function Main () {
$NCo = [NCo]::new()
$NCo.GetSystemInfo()
}

#-Main----------------------------------------------------------------
If ($PSVersionTable.PSVersion.Major -ge 5) {
Main
}

#-End-------------------------------------------------------------------

 

 



Hint: To bypassing unresolved errors of not available types inside the class I use a tiny trick, I externalize the code in a function - e.g. in this case Get-Destination.