Why make it simple when you can make it the hard way?
– Because you can? 🙂
The reason for why I needed this is not relevant, but the options when you get information from your computer is. Quite often there are multiple ways to get information: Pure PowerShell commands, registry, environment variables, running cmd/3rd party commands, or Windows API/C# code.
To demonstrate I wrote alternative ways of getting the information of what domain or workgroup the computer is a member of, happy PowerShell coding
PowerShell
Get-ComputerInfo | fl CsDomain
Windows API/C# code wrapped in Powershell
Add-Type -TypeDefinition @"
namespace PInvoke {
public enum NetJoinStatus
{
NetSetupUnknownStatus = 0,
NetSetupUnjoined,
NetSetupWorkgroupName,
NetSetupDomainName
}
}
"@;
$NetGetJoinInformation = @'
[DllImport("Netapi32.dll", CharSet=CharSet.Unicode, SetLastError=true)]
public static extern int NetGetJoinInformation(
string server,
out IntPtr domain,
out int status);
'@
$args1 = $null
$args2 = [IntPtr]::Zero
$args3 = New-Object PInvoke.NetJoinStatus;
$type = Add-Type -MemberDefinition $NetGetJoinInformation -Name NetJoin -Namespace Test -PassThru
$retValue = $type::NetGetJoinInformation($args1, [ref] $args2, [ref] $args3);
if ($retValue -eq 0) {
Write-Host "Success"
switch ($args3.ToString())
{
$([PInvoke.NetJoinStatus]::NetSetupUnknownStatus.value__) { Write-Host ([PInvoke.NetJoinStatus]::NetSetupUnknownStatus); continue }
$([PInvoke.NetJoinStatus]::NetSetupUnjoined.value__) { Write-Host ([PInvoke.NetJoinStatus]::NetSetupUnjoined); continue }
$([PInvoke.NetJoinStatus]::NetSetupDomainName.value__) { Write-Host "$([PInvoke.NetJoinStatus]::NetSetupDomainName): $([System.Runtime.InteropServices.Marshal]::PtrToStringAuto($args2))"; continue }
$([PInvoke.NetJoinStatus]::NetSetupWorkgroupName.value__) { Write-Host "$([PInvoke.NetJoinStatus]::NetSetupWorkgroupName): $([System.Runtime.InteropServices.Marshal]::PtrToStringAuto($args2))"; continue }
Default { write-host "Only errors" }
}
}
else
{
Write-Host "Error: I did not include any error control here :)";
}