cmd/cli: get AD domain using Windows API

This commit is contained in:
Cuong Manh Le
2024-11-21 20:24:46 +07:00
committed by Cuong Manh Le
parent 71e327653a
commit 9b6a308958
2 changed files with 49 additions and 5 deletions

View File

@@ -1,8 +1,11 @@
package cli
import (
"fmt"
"strings"
"syscall"
"unsafe"
"golang.org/x/sys/windows"
"github.com/Control-D-Inc/ctrld"
)
@@ -40,10 +43,15 @@ func addExtraSplitDnsRule(cfg *ctrld.Config) bool {
// getActiveDirectoryDomain returns AD domain name of this computer.
func getActiveDirectoryDomain() (string, error) {
cmd := "$obj = Get-WmiObject Win32_ComputerSystem; if ($obj.PartOfDomain) { $obj.Domain }"
output, err := powershell(cmd)
var domain *uint16
var status uint32
err := syscall.NetGetJoinInformation(nil, &domain, &status)
if err != nil {
return "", fmt.Errorf("failed to get domain name: %w, output:\n\n%s", err, string(output))
return "", err
}
return string(output), nil
defer syscall.NetApiBufferFree((*byte)(unsafe.Pointer(domain)))
if status == syscall.NetSetupDomainName {
return windows.UTF16PtrToString(domain), nil
}
return "", nil
}

View File

@@ -0,0 +1,36 @@
package cli
import (
"fmt"
"testing"
"time"
)
func Test_getActiveDirectoryDomain(t *testing.T) {
start := time.Now()
domain, err := getActiveDirectoryDomain()
if err != nil {
t.Fatal(err)
}
t.Logf("Using Windows API takes: %d", time.Since(start).Milliseconds())
start = time.Now()
domainPowershell, err := getActiveDirectoryDomainPowershell()
if err != nil {
t.Fatal(err)
}
t.Logf("Using Powershell takes: %d", time.Since(start).Milliseconds())
if domain != domainPowershell {
t.Fatalf("result mismatch, want: %v, got: %v", domainPowershell, domain)
}
}
func getActiveDirectoryDomainPowershell() (string, error) {
cmd := "$obj = Get-WmiObject Win32_ComputerSystem; if ($obj.PartOfDomain) { $obj.Domain }"
output, err := powershell(cmd)
if err != nil {
return "", fmt.Errorf("failed to get domain name: %w, output:\n\n%s", err, string(output))
}
return string(output), nil
}