第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何運(yùn)行用Golang編寫的應(yīng)用程序作為Windows服務(wù)

如何運(yùn)行用Golang編寫的應(yīng)用程序作為Windows服務(wù)

Go
偶然的你 2022-08-01 16:33:01
我無法使用我使用Win32 api開發(fā)的屏幕截圖應(yīng)用程序作為Windows后臺(tái)服務(wù)。我將其作為Windows后臺(tái)服務(wù)安裝并運(yùn)行,到目前為止我沒有問題。我的問題:該服務(wù)沒有給我打印輸出。不截取屏幕截圖。我嘗試制作另一個(gè)簡(jiǎn)單的應(yīng)用程序。我嘗試使用 OutputDebugStringW 函數(shù)發(fā)送消息,但我的問題沒有得到解決。無法使用 Win32 api 開發(fā) Windows 后臺(tái)應(yīng)用程序?為什么我會(huì)遇到此問題?如何使用win32 api將屏幕截圖應(yīng)用程序作為Windows后臺(tái)服務(wù)運(yùn)行?我的 Windows 后臺(tái)服務(wù)未生成輸出   package main        import (        "fmt"        "log"        "time"            "github.com/checkgo/win"        "github.com/kardianos/service"    )        var logger service.Logger        type program struct {        exit chan struct{}    }        func (p *program) Start(s service.Service) error {        if service.Interactive() {            logger.Info("Running in terminal.")        } else {            logger.Info("Running under service manager.")        }        p.exit = make(chan struct{})            // Start should not block. Do the actual work async.        go p.run()        return nil    }    func (p *program) run() {        logger.Infof("I'm running %v.", service.Platform())        ticker := time.NewTicker(2 * time.Second)        for {            select {            case tm := <-ticker.C:                win.OutputDebugString(fmt.Sprintf("%s : %v", "This is test message", tm))            case <-p.exit:                ticker.Stop()            }        } // link to whaterver image from the web        }    func (p *program) Stop(s service.Service) error {        // Stop should not block. Return with a few seconds.        return nil    }        func main() {        svcConfig := &service.Config{            Name:        "GoServiceExampleSimple",            DisplayName: "Go Service Example",            Description: "This is an example Go service.",        }            prg := &program{}        s, err := service.New(prg, svcConfig)        if err != nil {            log.Fatal(err)        }        logger, err = s.Logger(nil)        if err != nil {            log.Fatal(err)        }        err = s.Run()        if err != nil {            logger.Error(err)        }    }屏幕截圖:調(diào)試視圖和 Windows 服務(wù)屏幕捕獲
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

如果服務(wù)在 LocalSystem 帳戶的安全上下文中運(yùn)行,但不包括SERVICE_INTERACTIVE_PROCESS屬性,則它使用以下窗口工作站和桌面:Service-0x0-3e7$\default。此窗口站不是交互式的,因此服務(wù)無法顯示用戶界面。此外,由服務(wù)創(chuàng)建的進(jìn)程無法顯示用戶界面。

參考:窗口站和桌面創(chuàng)建

交互式窗口站是唯一可以顯示用戶界面或接收用戶輸入的窗口站。它被分配給交互式用戶的登錄會(huì)話,并包含鍵盤、鼠標(biāo)和顯示設(shè)備。它總是被命名為“WinSta0”。所有其他窗口站都是非交互式的,這意味著它們無法顯示用戶界面或接收用戶輸入。

參考:窗口站

據(jù)說您要捕獲的屏幕位于交互式窗口站的默認(rèn)桌面(Winsta0\default)。您可以在 中創(chuàng)建子進(jìn)程,子進(jìn)程用于屏幕截圖。使用 CreateProcessAsUser 調(diào)用服務(wù)中的子進(jìn)程。Winsta0\default

請(qǐng)參閱以下C++代碼。雖然這不是一門圍棋語言,但我認(rèn)為熟悉winapi的呼喚就足夠了。

DWORD WINAPI ServiceWorkerThread(LPVOID lpParam)

{

    OutputDebugString(_T("My Sample Service: ServiceWorkerThread: Entry"));

    WCHAR station[] = L"Winsta0\\default";

    SECURITY_ATTRIBUTES saAttr;

    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);

    saAttr.bInheritHandle = TRUE;

    saAttr.lpSecurityDescriptor = NULL;

     

    STARTUPINFO si;

    ZeroMemory(&si, sizeof(STARTUPINFO));

    si.cb = sizeof(STARTUPINFO);

    si.lpDesktop = station;

    si.dwFlags = STARTF_USESTDHANDLES;

    PROCESS_INFORMATION pi;


    HANDLE hToken;

    bool err = WTSQueryUserToken(WTSGetActiveConsoleSessionId(), &hToken);

    WCHAR path[] = L"D:\\child.exe";  //child.exe is used to take screenshots

    if (CreateProcessAsUser(hToken, path, NULL, 0, 0, true, CREATE_NO_WINDOW, 0, 0, &si, &pi))

    {

        ...


查看完整回答
反對(duì) 回復(fù) 2022-08-01
?
慕蓋茨4494581

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊

使用CreateProcessAsUser函數(shù)解決。

我用來解決問題的GOO源代碼。

Windows 后臺(tái)服務(wù)應(yīng)用程序的源代碼:

package main


import (

    "log"

    "reflect"

    "sync"

    "syscall"


    "github.com/checkgo/win"

    "github.com/kardianos/service"

    "golang.org/x/sys/windows"

)


var logger service.Logger


type program struct {

    exit chan struct{}

}


func (p *program) Start(s service.Service) error {

    if service.Interactive() {

        logger.Info("Running in terminal.")

    } else {

        logger.Info("Running under service manager.")

    }

    p.exit = make(chan struct{})


    // Start should not block. Do the actual work async.

    go p.run()

    return nil

}

func (p *program) run() {

    var wgT sync.WaitGroup

    wgT.Add(1)

    test(&wgT)

    wgT.Wait()

}


func test(wg *sync.WaitGroup) {

    var saAttr win.SECURITY_ATTRIBUTES

    saAttr.NLength = uint32(reflect.TypeOf(syscall.SecurityAttributes{}).Size())

    saAttr.BInheritHandle = win.TRUE

    saAttr.LpSecurityDescriptor = uintptr(0)


    var si syscall.StartupInfo

    si.Cb = uint32(reflect.TypeOf(syscall.SecurityAttributes{}).Size())

    si.Desktop = windows.StringToUTF16Ptr("Winsta0\\default")

    si.Flags = windows.STARTF_USESTDHANDLES

    var hToken windows.Token

    id := win.WTSGetActiveConsoleSessionId()

    err := windows.WTSQueryUserToken(uint32(id), &hToken)

    if err != nil {

        logger.Info(err)

    }

    path := windows.StringToUTF16Ptr("C:\\Users\\cingo\\go\\src\\srv\\agent\\test_agent.exe")


    var pi syscall.ProcessInformation

    syscall.CreateProcessAsUser(syscall.Token(hToken),

        path,

        nil,

        nil,

        nil,

        true,

        windows.CREATE_NO_WINDOW,

        nil,

        nil,

        &si,

        &pi)


}


func (p *program) Stop(s service.Service) error {

    // Stop should not block. Return with a few seconds.

    return nil

}


func main() {

    svcConfig := &service.Config{

        Name:        "GoServiceExampleSimple",

        DisplayName: "Go Service Example",

        Description: "This is an example Go service.",

    }


    prg := &program{}

    s, err := service.New(prg, svcConfig)

    if err != nil {

        log.Fatal(err)

    }

    logger, err = s.Logger(nil)

    if err != nil {

        log.Fatal(err)

    }

    err = s.Run()

    if err != nil {

        logger.Error(err)

    }

}

正在運(yùn)行的應(yīng)用程序


package main


import (

    "fmt"

    "github.com/checkgo/win"

    "time"

)


func main() {

    for {

        time.Sleep(time.Second * 1)

        win.OutputDebugString(fmt.Sprintf("%s", "This is test message"))

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-08-01
  • 2 回答
  • 0 關(guān)注
  • 395 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)