覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Go言語 - WindowsのセッションID取得

Windowsではログオンしたユーザごとにセッションが存在しています。(セッション 0 の分離 - Windows 7 対応アプリケーションの互換性

そのセッションのセッションIDをGo言語で取得するサンプルです。

本サンプルでは自プロセスIDを元にそのプロセスが存在しているセッションのセッションIDを取得します


■サンプルコード

package main

import (
    "fmt"
    "os"
    "syscall"
    "unsafe"
)

func abort(funcname string, err error) {
    panic(fmt.Sprintf("%s failed: %v", funcname, err))
}

var (
    kernel32, _ = syscall.LoadLibrary("kernel32.dll")

    processIDToSessionID, _ = syscall.GetProcAddress(kernel32, "ProcessIdToSessionId")
)

func main() {
    fmt.Printf("My Session Id: %d", MySessionID())
}

func MySessionID() uint32 {
    var sessionID uint32
    _, _, callErr := syscall.Syscall(uintptr(processIDToSessionID),
        2,
        uintptr(os.Getpid()),
        uintptr(unsafe.Pointer(&sessionID)),
        0)
    if callErr != 0 {
        abort("Call ProcessIdToSessionId", callErr)
    }
    return sessionID
}

単純に、os.Getpidの結果を引数にして、WindowsAPIのProcessIdToSessionIdを呼び出しているだけです。(ProcessIdToSessionId 関数


■実行結果

My Session Id: 1

無事にセッションIDが取得できました



関連エントリ