mirror of
https://github.com/FalconOpsLLC/goexec
synced 2026-06-06 15:44:27 +00:00
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package tschexec
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/FalconOpsLLC/goexec/pkg/goexec"
|
|
"github.com/oiweiwei/go-msrpc/msrpc/tsch/itaskschedulerservice/v1"
|
|
"github.com/rs/zerolog"
|
|
|
|
_ "github.com/oiweiwei/go-msrpc/msrpc/erref/ntstatus"
|
|
_ "github.com/oiweiwei/go-msrpc/msrpc/erref/win32"
|
|
)
|
|
|
|
const (
|
|
MethodDemand = "Demand"
|
|
)
|
|
|
|
type TschDemand struct {
|
|
Tsch
|
|
goexec.Executor
|
|
goexec.Cleaner
|
|
|
|
IO goexec.ExecutionIO
|
|
|
|
NoDelete bool
|
|
NoStart bool
|
|
SessionId uint32
|
|
}
|
|
|
|
func (m *TschDemand) Execute(ctx context.Context, execIO *goexec.ExecutionIO) (err error) {
|
|
|
|
log := zerolog.Ctx(ctx).With().
|
|
Str("module", ModuleName).
|
|
Str("method", MethodDemand).
|
|
Str("task", m.TaskPath).
|
|
Logger()
|
|
|
|
path, err := m.registerTask(ctx,
|
|
®isterOptions{
|
|
AllowStartOnDemand: true,
|
|
AllowHardTerminate: true,
|
|
Hidden: !m.NotHidden,
|
|
triggers: taskTriggers{},
|
|
},
|
|
execIO,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
log.Info().Msg("Task registered")
|
|
|
|
if !m.NoDelete {
|
|
m.AddCleaners(func(ctxInner context.Context) error {
|
|
return m.deleteTask(ctxInner, path)
|
|
})
|
|
}
|
|
|
|
if !m.NoStart {
|
|
|
|
var flags uint32
|
|
if m.SessionId != 0 {
|
|
flags |= 4
|
|
}
|
|
|
|
runResponse, err := m.tsch.Run(ctx, &itaskschedulerservice.RunRequest{
|
|
Path: path,
|
|
Flags: flags,
|
|
SessionID: m.SessionId,
|
|
})
|
|
|
|
if err != nil {
|
|
log.Error().Err(err).Msg("Failed to run task")
|
|
return fmt.Errorf("run task: %w", err)
|
|
}
|
|
if ret := uint32(runResponse.Return); ret != 0 {
|
|
log.Error().Str("code", fmt.Sprintf("0x%08x", ret)).Msg("Task returned non-zero exit code")
|
|
return fmt.Errorf("task returned non-zero exit code: 0x%08x", ret)
|
|
}
|
|
|
|
log.Info().Msg("Task started successfully")
|
|
}
|
|
return
|
|
}
|