Skip to content

Commit

Permalink
Add checkup for intune
Browse files Browse the repository at this point in the history
  • Loading branch information
RebeccaMahany committed Dec 8, 2023
1 parent e347655 commit 41d213b
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 0 deletions.
4 changes: 4 additions & 0 deletions ee/allowedcmd/cmd_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ func Ipconfig(ctx context.Context, arg ...string) (*exec.Cmd, error) {
return validatedCommand(ctx, filepath.Join(os.Getenv("WINDIR"), "System32", "ipconfig.exe"), arg...)
}

func MdmDiagnosticsTool(ctx context.Context, arg ...string) (*exec.Cmd, error) {
return validatedCommand(ctx, filepath.Join(os.Getenv("WINDIR"), "System32", "mdmdiagnosticstool.exe"), arg...)
}

func Powercfg(ctx context.Context, arg ...string) (*exec.Cmd, error) {
return validatedCommand(ctx, filepath.Join(os.Getenv("WINDIR"), "System32", "powercfg.exe"), arg...)
}
Expand Down
1 change: 1 addition & 0 deletions ee/debug/checkups/checkups.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ func checkupsFor(k types.Knapsack, target targetBits) []checkupInt {
{&osqConfigConflictCheckup{}, doctorSupported | flareSupported},
{&serverDataCheckup{k: k}, doctorSupported | flareSupported | logSupported},
{&osqDataCollector{k: k}, doctorSupported | flareSupported},
{&intuneCheckup{}, flareSupported},
}

checkupsToRun := make([]checkupInt, 0)
Expand Down
35 changes: 35 additions & 0 deletions ee/debug/checkups/intune_other.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//go:build !windows
// +build !windows

package checkups

import (
"context"
"io"
)

type intuneCheckup struct{}

func (i *intuneCheckup) Name() string {
return ""
}

func (i *intuneCheckup) Run(_ context.Context, _ io.Writer) error {
return nil
}

func (i *intuneCheckup) ExtraFileName() string {
return ""
}

func (i *intuneCheckup) Status() Status {
return Informational
}

func (i *intuneCheckup) Summary() string {
return ""
}

func (i *intuneCheckup) Data() any {
return nil
}
115 changes: 115 additions & 0 deletions ee/debug/checkups/intune_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
//go:build windows
// +build windows

package checkups

import (
"archive/zip"
"context"
"fmt"
"io"
"os"
"path/filepath"
"strings"

"github.com/kolide/launcher/ee/agent"
"github.com/kolide/launcher/ee/allowedcmd"
)

type intuneCheckup struct {
summary string
}

func (i *intuneCheckup) Name() string {
return "Intune"
}

func (i *intuneCheckup) Run(ctx context.Context, extraWriter io.Writer) error {
// Other areas of interest: https://learn.microsoft.com/en-us/mem/intune/remote-actions/collect-diagnostics

zipWriter := zip.NewWriter(extraWriter)
defer zipWriter.Close()

if err := agentLogs(zipWriter); err != nil {
i.summary += fmt.Sprintf("Failed to collect Intune agent logs: %v. ", err)
}

if err := installLogs(zipWriter); err != nil {
i.summary += fmt.Sprintf("Failed to collect Intune install logs: %v. ", err)
}

if err := diagnostics(ctx, zipWriter); err != nil {
i.summary += fmt.Sprintf("Failed to collect Intune diagnostics: %v. ", err)
}

i.summary = strings.TrimSpace(i.summary)

return nil
}

func agentLogs(zipWriter *zip.Writer) error {
agentLogsPathPattern := filepath.Join(os.Getenv("SYSTEMROOT"), "ProgramData", "Microsoft", "IntuneManagementExtension", "Logs", "*")
matches, err := filepath.Glob(agentLogsPathPattern)
if err != nil {
return fmt.Errorf("globbing for agent logs at %s: %w", agentLogsPathPattern, err)
}

for _, match := range matches {
if err := addFileToZip(zipWriter, match); err != nil {
return fmt.Errorf("adding %s to zip: %w", match, err)
}
}

return nil
}

func installLogs(zipWriter *zip.Writer) error {
installLogsPathPattern := filepath.Join(os.Getenv("WINDIR"), "System32", "config", "systemprofile", "AppData", "Local", "mdm", "*.log")
matches, err := filepath.Glob(installLogsPathPattern)
if err != nil {
return fmt.Errorf("globbing for install logs at %s: %w", installLogsPathPattern, err)
}

for _, match := range matches {
if err := addFileToZip(zipWriter, match); err != nil {
return fmt.Errorf("adding %s to zip: %w", match, err)
}
}

return nil
}

func diagnostics(ctx context.Context, zipWriter *zip.Writer) error {
tempDir, err := agent.MkdirTemp("mdm-diagnostics")
if err != nil {
return fmt.Errorf("creating temp dir: %w", err)
}
defer os.RemoveAll(tempDir)

tempOutfile := filepath.Join(tempDir, "MdmDiagnosticReport.zip")

cmd, err := allowedcmd.MdmDiagnosticsTool(ctx, "-zip", tempOutfile)
if cmd == nil {
return nil
} else if err != nil {
return fmt.Errorf("creating diagnostics command: %w", err)
}

return addFileToZip(zipWriter, tempOutfile)
}

func (i *intuneCheckup) ExtraFileName() string {
return "intune.zip"
}

func (i *intuneCheckup) Status() Status {
return Informational
}

func (i *intuneCheckup) Summary() string {
return i.summary
}

func (i *intuneCheckup) Data() any {
return nil
}

0 comments on commit 41d213b

Please sign in to comment.