{"id":15164238,"url":"https://github.com/iamacarpet/go-win64api","last_synced_at":"2025-05-16T13:03:28.443Z","repository":{"id":12992881,"uuid":"57283237","full_name":"iamacarpet/go-win64api","owner":"iamacarpet","description":"Windows API wrappers for Go - useful for SysOps","archived":false,"fork":false,"pushed_at":"2024-05-07T09:54:29.000Z","size":190,"stargazers_count":506,"open_issues_count":17,"forks_count":101,"subscribers_count":15,"default_branch":"master","last_synced_at":"2025-04-09T10:04:32.083Z","etag":null,"topics":["go","golang","golang-wrapper","sysops","windows-10","windows-api"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iamacarpet.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-04-28T08:14:24.000Z","updated_at":"2025-04-09T02:59:20.000Z","dependencies_parsed_at":"2024-03-31T14:26:14.369Z","dependency_job_id":"68f0efd2-2ffc-489b-9944-4794adf44595","html_url":"https://github.com/iamacarpet/go-win64api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamacarpet%2Fgo-win64api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamacarpet%2Fgo-win64api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamacarpet%2Fgo-win64api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iamacarpet%2Fgo-win64api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iamacarpet","download_url":"https://codeload.github.com/iamacarpet/go-win64api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254535826,"owners_count":22087398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","golang-wrapper","sysops","windows-10","windows-api"],"created_at":"2024-09-27T03:02:29.888Z","updated_at":"2025-05-16T13:03:28.421Z","avatar_url":"https://github.com/iamacarpet.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GoLang Windows API Wrappers\r\n## For System Info / User Management.\r\nFor an internal project, this is a set of wrappers for snippets of the Windows API.\r\n\r\nTested and developed for Windows 10 x64.\r\n\r\nAll functions that return useful data, do so in the form of JSON exportable structs.\r\n\r\nThese structs are available in the shared library, \"github.com/iamacarpet/go-win64api/shared\"\r\n\r\n### Process List\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main(){\r\n    pr, err := wapi.ProcessList()\r\n    if err != nil {\r\n        fmt.Printf(\"Error fetching process list... %s\\r\\n\", err.Error())\r\n    }\r\n    for _, p := range pr {\r\n        fmt.Printf(\"%8d - %-30s - %-30s - %s\\r\\n\", p.Pid, p.Username, p.Executable, p.Fullpath)\r\n    }\r\n}\r\n```\r\n\r\n### Active Session List (Logged in users + Run-As users)\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main(){\r\n    // This check runs best as NT AUTHORITY\\SYSTEM\r\n    //\r\n    // Running as a normal or even elevated user,\r\n    // we can't properly detect who is an admin or not.\r\n    //\r\n    // This is because we require TOKEN_DUPLICATE permission,\r\n    // which we don't seem to have otherwise (Win10).\r\n    users, err := wapi.ListLoggedInUsers()\r\n    if err != nil {\r\n        fmt.Printf(\"Error fetching user session list.\\r\\n\")\r\n        return\r\n    }\r\n\r\n    fmt.Printf(\"Users currently logged in (Admin check doesn't work for AD Accounts):\\r\\n\")\r\n    for _, u := range users {\r\n        fmt.Printf(\"\\t%-50s - Local User: %-5t - Local Admin: %t\\r\\n\", u.FullUser(), u.LocalUser, u.LocalAdmin)\r\n    }\r\n}\r\n```\r\n\r\n### Installed Software List\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main(){\r\n    sw, err := wapi.InstalledSoftwareList()\r\n    if err != nil {\r\n        fmt.Printf(\"%s\\r\\n\", err.Error())\r\n    }\r\n\r\n    for _, s := range sw {\r\n        fmt.Printf(\"%-100s - %s - %s\\r\\n\", s.Name(), s.Architecture(), s.Version())\r\n    }\r\n}\r\n```\r\n\r\n### Windows Update Status\r\n```go\r\npackage main\r\n\r\nimport (\r\n        \"fmt\"\r\n        \"time\"\r\n        wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main() {\r\n        ret, err := wapi.UpdatesPending()\r\n        if err != nil {\r\n                fmt.Printf(\"Error fetching data... %s\\r\\n\", err.Error())\r\n        }\r\n\r\n        fmt.Printf(\"Number of Updates Available: %d\\n\", ret.NumUpdates)\r\n        fmt.Printf(\"Updates Pending:             %t\\n\\n\", ret.UpdatesReq)\r\n        fmt.Printf(\"%25s | %25s | %s\\n\", \"EVENT DATE\", \"STATUS\", \"UPDATE NAME\")\r\n        for _, v := range ret.UpdateHistory {\r\n                fmt.Printf(\"%25s | %25s | %s\\n\", v.EventDate.Format(time.RFC822), v.Status, v.UpdateName)\r\n        }\r\n}\r\n```\r\n\r\n## Local Service Management\r\n### List Services\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n\r\n    wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main(){\r\n    svc, err := wapi.GetServices()\r\n    if err != nil {\r\n        fmt.Printf(\"%s\\r\\n\", err.Error())\r\n    }\r\n\r\n    for _, v := range svc {\r\n        fmt.Printf(\"%-50s - %-75s - Status: %-20s - Accept Stop: %-5t, Running Pid: %d\\r\\n\", v.SCName, v.DisplayName, v.StatusText, v.AcceptStop, v.RunningPid)\r\n    }\r\n}\r\n```\r\n### Start Service\r\n```go\r\nerr := wapi.StartService(service_name)\r\n```\r\n### Stop Service\r\n```go\r\nerr := wapi.StopService(service_name)\r\n```\r\n\r\n## Local User Management\r\n### List Local Users\r\n```go\r\npackage main\r\n\r\nimport (\r\n    \"fmt\"\r\n    \"time\"\r\n    wapi \"github.com/iamacarpet/go-win64api\"\r\n)\r\n\r\nfunc main(){\r\n    users, err := wapi.ListLocalUsers()\r\n    if err != nil {\r\n        fmt.Printf(\"Error fetching user list, %s.\\r\\n\", err.Error())\r\n        return\r\n    }\r\n\r\n    for _, u := range users {\r\n        fmt.Printf(\"%s (%s)\\r\\n\", u.Username, u.FullName)\r\n        fmt.Printf(\"\\tIs Enabled:                   %t\\r\\n\", u.IsEnabled)\r\n        fmt.Printf(\"\\tIs Locked:                    %t\\r\\n\", u.IsLocked)\r\n        fmt.Printf(\"\\tIs Admin:                     %t\\r\\n\", u.IsAdmin)\r\n        fmt.Printf(\"\\tPassword Never Expires:       %t\\r\\n\", u.PasswordNeverExpires)\r\n        fmt.Printf(\"\\tUser can't change password:   %t\\r\\n\", u.NoChangePassword)\r\n        fmt.Printf(\"\\tPassword Age:                 %.0f days\\r\\n\", (u.PasswordAge.Hours()/24))\r\n        fmt.Printf(\"\\tLast Logon Time:              %s\\r\\n\", u.LastLogon.Format(time.RFC850))\r\n        fmt.Printf(\"\\tBad Password Count:           %d\\r\\n\", u.BadPasswordCount)\r\n        fmt.Printf(\"\\tNumber Of Logons:             %d\\r\\n\", u.NumberOfLogons)\r\n    }\r\n}\r\n```\r\n### Adding a Local User\r\n```go\r\nok, err := wapi.UserAdd(username, fullname, password)\r\n```\r\n### Deleting a Local User\r\n```go\r\nok, err := wapi.UserDelete(username)\r\n```\r\n### Set Full Name Attribute\r\n```go\r\nok, err := wapi.UserUpdateFullname(username, fullname)\r\n```\r\n### Give Admin Privileges\r\n```go\r\nok, err := wapi.SetAdmin(username)\r\n```\r\n### Revoke Admin Privileges\r\n```go\r\nok, err := wapi.RevokeAdmin(username)\r\n```\r\n### Disable/Enable User\r\n```go\r\ns := true   // disable user\r\ns := false  // enable user\r\nok, err := wapi.UserDisabled(username, s)\r\n```\r\n### Change Attribute - User Can't Change Password\r\n```go\r\ns := true   // User can't change password\r\ns := false  // User can change password\r\nok, err := wapi.UserDisablePasswordChange(username, s)\r\n```\r\n### Change Attribute - Password Never Expires\r\n```go\r\ns := true   // Password never expires.\r\ns := false  // Enable password expiry.\r\nok, err := wapi.UserPasswordNoExpires(username, s)\r\n```\r\n### Forced Password Change\r\n```go\r\nok, err := wapi.ChangePassword(username, newpassword)\r\n```\r\n\r\n### Windows Firewall - Add Inbound Rule\r\n```go\r\nadded, err := wapi.FirewallRuleCreate(\r\n\t\"App Rule Name\",\r\n\t\"App Rule Long Description.\",\r\n\t\"My Rule Group\",\r\n\t\"%systemDrive%\\\\path\\\\to\\\\my.exe\",\r\n\t\"port number as string\",\r\n\twapi.NET_FW_IP_PROTOCOL_TCP,\r\n)\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamacarpet%2Fgo-win64api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiamacarpet%2Fgo-win64api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiamacarpet%2Fgo-win64api/lists"}