Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

19
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ใ€ๆƒ…ใ‚ทใ‚นใ•ใ‚“ๅ‘ใ‘ใ€‘ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใงใ‚‚ใ‚ขใƒ—ใƒชใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใ‚‹ใ‚ˆใ†ใซใ™ใ‚‹

Last updated at Posted at 2023-10-29

ใจใ‚ใ‚‹ๅŒป็™‚ใ‚ปใƒณใ‚ฟใƒผใฎใƒฉใƒณใ‚ตใƒ ่ขซๅฎณ

ๆŸๅŒป็™‚ใ‚ปใƒณใ‚ฟใƒผใงใฏใ€ใƒฆใƒผใ‚ถใƒผใฎๅคšใใซ็ฎก็†่€…ๆจฉ้™ใ‚’ไป˜ไธŽใ—ใฆใ„ใŸใ‚ˆใ†ใงใ™
ใ“ใฎใ‚ˆใ†ใช็ฎก็†ใฏใ€ใšใ•ใ‚“ใชไฝ“ๅˆถ ใจ่กจ็พใ•ใ‚Œใ‚‹ใ‚ˆใ†ใงใ™ใญ

ใ‚นใƒžใƒผใƒˆใชๆƒ…ใ‚ทใ‚นใ•ใ‚“๏ผˆๅ€‹ไบบ็š„่ฆ‹่งฃ๏ผ‰

็ฎก็†่€…ๆจฉ้™ใ‚’ใฐใ‚‰ๆ’’ใใ“ใจใŒไธ€ๆฆ‚ใซใƒ€ใƒกใจใฏ่จ€ใ„ใพใ›ใ‚“ใŒ
ใ‚นใƒžใƒผใƒˆใชๆƒ…ใ‚ทใ‚นใ•ใ‚“ใชใ‚‰ใ€ใใ‚“ใชใ“ใจใ—ใพใ›ใ‚“ใ‚ˆใญ

้™ใ‚‰ใ‚ŒใŸใƒฆใƒผใ‚ถใƒผใซใ ใ‘ใ€็ฎก็†่€…ๆจฉ้™ใ‚’ไธŽใˆใ‚‹ ใฎใŒใ‚นใƒžใƒผใƒˆใชๆƒ…ใ‚ทใ‚นใ•ใ‚“ใงใ™โœจ

ๆƒ…ใ‚ทใ‚นใ•ใ‚“ใฎ่‹ฆๆ‚ฉใ€€๏ฝž็ฎก็†่€…1ไบบ vs ่†จๅคงใช็ซฏๆœซ๏ฝž

ใงใฏใ€ใชใœๅบƒใๅคšใใฎใƒฆใƒผใ‚ถใƒผใซ็ฎก็†่€…ๆจฉ้™ใ‚’ไธŽใˆใ‚‹ใ“ใจใซใชใ‚‹ใฎใ‹๏ผŸ
ใใฎ็†็”ฑใฎ๏ผ‘ใคใฏใ€ใ„ใกใ„ใกๆƒ…ใ‚ทใ‚นใ•ใ‚“ใŒๅ‡บๅ‘ใ„ใฆ็ซฏๆœซๆ“ไฝœใ—ใฆใ‚‰ใ‚Œใชใ„ใ‹ใ‚‰ใงใ™

ใŸใจใˆใฐใ€ใ‚ฝใƒ•ใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใฏใ€็ฎก็†่€…ๆจฉ้™ใŒ็„กใ„ใจใงใใชใ„ๆ“ไฝœใงใ™

  • ใ‚ฝใƒ•ใƒˆใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸใ„ไบบใŒ็พใ‚Œใ‚‹ใŸใณใ€ๆƒ…ใ‚ทใ‚นใ•ใ‚“ใŒ็ซฏๆœซใ‚’ๆ“ไฝœใ—ใซ่กŒใใพใ™
  • ใ‚ฝใƒ•ใƒˆใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใŸไบบใŒใŸใใ•ใ‚“ใ„ใฆใ‚‚ใ€ๆƒ…ใ‚ทใ‚นใ•ใ‚“ใฏ๏ผ‘ไบบใ‹๏ผ’ไบบใงใ™
  • ๅคงใใชไผๆฅญใงใ‚‚ๆƒ…ใ‚ทใ‚นใ•ใ‚“ใฏ๏ผ‘๏ผไบบใใ‚‰ใ„ใงใ™๏ผˆ่ฆๅ‡บๅ…ธ๏ผ‰

ใƒปใƒปใƒปไบบๆ‰‹ใŒ่ถณใ‚Šใชใ„ใงใ™ใญ
ใ˜ใ‚ƒใ‚ใ€ใ‚‚ใ†ใ‚ฝใƒ•ใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใฏ่‡ชๅˆ†ใงใ‚„ใฃใฆใ‚‚ใ‚‰ใ„ใพใ—ใ‚‡ใ†๏ผ

ใจใ„ใ†ใ“ใจใงใ€็ฎก็†่€…ๆจฉ้™ใ‚’ๅ…จใƒฆใƒผใ‚ถใƒผใซใฐใ‚‰ๆ’’ใใ“ใจใซใชใ‚‹ใฎใงใ™

ๆŸๅŒป็™‚ใ‚ปใƒณใ‚ฟใƒผใฎๅฎŸๆƒ…ใฏใ„ใ–็Ÿฅใ‚‰ใšใ€ไธ–้–“ใฎๆƒ…ใ‚ทใ‚นใ•ใ‚“ใฏๅคงๅค‰ใชใฎใงใ™

ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใงใ‚‚ใ‚ฝใƒ•ใƒˆใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใงใใŸใ‚‰ใ‚คใ‚คใญ๐Ÿ˜€

ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใงใƒญใ‚ฐใ‚คใƒณใ—ใฆใ„ใฆใ‚‚ใ€ใ‚ฝใƒ•ใƒˆใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹ใจใใ ใ‘็ฎก็†่€…ๆจฉ้™ใ‚’ไฝฟใˆใŸใ‚‰ใ„ใ„ใงใ™ใญ

ใใ‚“ใชใ“ใจใงใใ‚‹ใฎใงใ—ใ‚‡ใ†ใ‹๏ผŸ
ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใซใฏ็ฎก็†่€…ๆจฉ้™ใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰ใŒใƒใƒฌใฆใฏใ„ใ‘ใพใ›ใ‚“

SYSTEMใƒฆใƒผใ‚ถใƒผ๏ผˆ็ฎก็†่€…ๆจฉ้™ใ‚ใ‚Š๏ผ‰ใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ•ใ›ใ‚ˆใ†

Windowsใƒžใ‚ทใƒณใงใฏใ€ๅธธใซใƒใƒƒใ‚ฏใ‚ฐใƒฉใ‚ฆใƒณใƒ‰ใงใ‚ตใƒผใƒ“ใ‚นใŒๅ‹•ใ„ใฆใ„ใพใ™
ใƒฆใƒผใ‚ถใƒผใฎ็›ฎใงใฏ่ฆ‹ใˆใชใ„ใจใ“ใ‚ใงใ€ใ›ใฃใ›ใจใ‚ตใƒผใƒ“ใ‚นใฏๅ‹•ใ„ใฆใ„ใพใ™
ใ‚ตใƒผใƒ“ใ‚นใฏๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใ‚ˆใ‚Šใ‚‚ๅผทใ„ๆจฉ้™ใงๅ‹•ใ„ใฆใ„ใพใ™

ใ€ŒSystemใ€ใฏAdministratorsใ‚ฐใƒซใƒผใƒ—ใฎใƒกใƒณใƒใจๅŒ็ญ‰ใฎๆจฉ้™ใ‚’ๆŒใคใ‚ขใ‚ซใ‚ฆใƒณใƒˆใงใ€ใ‚ทใ‚นใƒ†ใƒ ใธใฎใƒ•ใƒซใ‚ขใ‚ฏใ‚ปใ‚นใŒๅฏ่ƒฝใ ใ€‚

ใ‚ˆใ—ใ€ใ‚ฝใƒ•ใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซใ‚’ใ‚ตใƒผใƒ“ใ‚นใซไปปใ›ใŸใ‚‰ใ„ใ„ใฎใ ๏ผ

Systemใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏๅผทๅŠ›ใชๆจฉ้™ใ‚’ๆŒใคใŸใ‚ใ€ๆ”ปๆ’ƒ่€…ใซใ‚ตใƒผใƒ“ใ‚นใฎ่„†ๅผฑ๏ผˆใœใ„ใ˜ใ‚ƒใ๏ผ‰ๆ€งใ‚’็ชใ‹ใ‚Œใฆไน—ใฃๅ–ใ‚‰ใ‚ŒใŸ้š›ใ€่ขซๅฎณใŒ็”šๅคงใซใชใ‚Šใ‹ใญใชใ„ใงใ™ใ€‚่‡ชๅทฑ่ฒฌไปปใงใŠ้ก˜ใ„ใ—ใพใ™ใ€‚

ๅ…่ฒฌไบ‹้ …

ไปฅไธ‹ใฎใ‚ณใƒผใƒ‰ใงไฝ•ใ‹ไธๅ…ทๅˆใŒ่ตทใใฆใ‚‚ใ€็งใฏไธ€ๅˆ‡ใฎ่ฒฌไปปใ‚’ใจใ‚Œใพใ›ใ‚“

โ˜…ๅŸบๆœฌๆ–น้‡โ˜…

ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใซใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใปใ—ใ„ใ‚ฝใƒ•ใƒˆใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’็”จๆ„ใ—ใพใ™
ใ‚ˆใใ‚ใ‚‹ใฎใŒsetup.exeใจใ„ใ†ใƒ•ใ‚กใ‚คใƒซใงใ™

ใ“ใ‚Œใ‚’Windowsๆจ™ๆบ–ใ‚ฝใƒ•ใƒˆใงใ‚ใ‚‹IExpressใงEXEๅŒ–ใ—ใพใ™
๏ผˆไปฅไธ‹ใ“ใฎEXEๅŒ–ใ—ใŸใ‚‚ใฎใ‚’ใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใจๅ‘ผใณใพใ™๏ผ‰
ใ“ใฎใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใŒใƒ€ใƒ–ใƒซใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹ใจใ€ๆœฌ็‰ฉใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผ(setup.exe)ใŒ่ตทๅ‹•ใ™ใ‚‹็ฎ—ๆฎตใงใ™

ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใƒชใ‚นใ‚ฏใซใคใ„ใฆ

่ชฐใงใ‚‚setup.exeใ‚’IExpressใงEXEๅŒ–ใ—ใŸใ‚‰ใ€ไปปๆ„ใฎsetup.exeใ‚’่ตฐใ‚‰ใ›ใ‚‹ใ“ใจใŒใงใใฆใ€ๆ‚ชๆ„ใฎใ‚ใ‚‹ใ‚ฝใƒ•ใƒˆใ‚’ใƒฆใƒผใ‚ถใƒผใŒใ‚คใƒณใ‚นใƒˆใƒผใƒซใ™ใ‚‹ใƒชใ‚นใ‚ฏใŒใ‚ใ‚Šใพใ™ใญ
ใงใ‚‚ๅคงไธˆๅคซใงใ™๏ผ
IExpressใ‚’ไฝฟ็”จใ™ใ‚‹ใŸใ‚ใซใฏ็ฎก็†่€…ๆจฉ้™ใŒๅฟ…่ฆใงใ™
่ชฐใใ‚Œๆง‹ใ‚ใšEXEๅŒ–ใ™ใ‚‹ใ“ใจใฏใงใใชใ„๏ผˆ๏ผใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใฏ็ฎก็†่€…ๆจฉ้™ใงใ—ใ‹ไฝœใ‚Œใชใ„๏ผ‰ใ‚ˆใ†ใซใชใฃใฆใ„ใพใ™ใฎใงใ€ใ“ใ“ใงใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๆ‹…ไฟใ—ใพใ™

ๅ‚่€ƒ: IExpressใ‚’ไฝฟใฃใฆbatใƒ•ใ‚กใ‚คใƒซใ‚’exeๅŒ–ใ™ใ‚‹ๆ–นๆณ•

ใพใŸใ€ๅพŒ่ฟฐใ—ใพใ™ใŒใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใ‚’ๅ…ƒใซใ—ใŸ็Ÿฅ่ญ˜ๆš—ๅทใ‚’ใคใ‹ใฃใฆใ€ๆ‚ชๆ„ใ‚ใ‚‹ๆ“ไฝœใ‚’้˜ฒใๆ‰‹ๆฎตใ‚‚่€ƒใˆใฆใพใ™

ใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใฎๅฎŸ่กŒๆ–นๆณ•

ใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅฎŸ่กŒใ™ใ‚‹ใจใ€ๆœฌ็‰ฉใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผ(setup.exeใชใฉ)ใ‚’ใฉใ“ใ‹ใฎใƒ•ใ‚ฉใƒซใƒ€ใƒผใซ็ฝฎใใพใ™
ใ“ใฎใƒ•ใ‚ฉใƒซใƒ€ใƒผใ‚’ใ‚ตใƒผใƒ“ใ‚นใซ็›ฃ่ฆ–ใ•ใ›ใพใ™
ใ‚ตใƒผใƒ“ใ‚นใฏ็›ฃ่ฆ–ๅ…ˆใฎใƒ•ใ‚ฉใƒซใƒ€ใƒผใซๆœฌ็‰ฉใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใŒ็ฝฎใ‹ใ‚ŒใŸใ‚‰ใ€ใใ‚Œใ‚’ๅฎŸ่กŒใ—ใพใ™

ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใงใƒญใ‚ฐใ‚คใƒณใ—ใฆใ„ใŸใจใ—ใฆใ‚‚ใ€ๆœฌ็‰ฉใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅฎŸ่กŒใ™ใ‚‹ใฎใฏใ‚ตใƒผใƒ“ใ‚นใงใ™
๏ผˆใ‚ตใƒผใƒ“ใ‚นใฏ็ฎก็†่€…ๆจฉ้™ใจๅŒใ˜ๅผทใ„ๆจฉ้™ใ‚’ๆŒใฃใฆใ„ใพใ™ใฎใงใ€ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅฎŸ่กŒใงใใพใ™๏ผ‰

ใใฎใ‚ตใƒผใƒ“ใ‚นใฏใฉใ†ใ‚„ใฃใฆใคใใ‚‹ใ‹๏ผŸ
ใƒปใƒปใƒปC#ใจC++ใง่‡ชไฝœใ—ใพใ™๏ผ

ใ‚ตใƒผใƒ“ใ‚นใ‚’ไฝœใ‚‹

ใƒžใ‚คใ‚ฏใƒญใ‚ฝใƒ•ใƒˆใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚’ๅ‚่€ƒใซใ€C#ใงใƒ—ใƒญใ‚ฐใƒฉใƒ ใ‚’ๆ›ธใใพใ™

ใ‚ใ‚‰ใ‹ใ˜ใ‚dotnetใ‚ณใƒžใƒณใƒ‰ใ‚’ใ‚คใƒณใ‚นใƒˆใƒผใƒซใ—ใฆใŠใใพใ—ใ‚‡ใ†

ใ‚ณใƒžใƒณใƒ‰ใƒ—ใƒญใƒณใƒ—ใƒˆใงdotnet --versionใ‚’ๆ‰“ใคใจใƒใƒผใ‚ธใƒงใƒณใŒ่กจ็คบใ•ใ‚Œใ‚‹ใฏใšใงใ™

dotnet --version
7.0.403

ใ‚ใจใฏใ€ใƒžใ‚คใ‚ฏใƒญใ‚ฝใƒ•ใƒˆใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซใ—ใŸใŒใฃใฆใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใ‚’ไฝœๆˆใ—ใพใ™
ไฝœๆˆใ—ใŸใ‚ใจใฏใ€ไธ‹่จ˜ใฎ้€šใ‚ŠC#ใ‚ณใƒผใƒ‰ใ‚’ๅค‰ๆ›ดใ—ใฆใใ ใ•ใ„

C#ใ‚ณใƒผใƒ‰๏ผˆโ–ถใ‚’ๆŠผใ™ใจๅฑ•้–‹ใ™ใ‚‹ใ‚ˆ๏ผ‰
MyService.csproj
<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <UserSecretsId>dotnet-MyService-24f66dd5-0856-40e4-a83b-0086ec7054b5</UserSecretsId>
    <OutputType>exe</OutputType>
    <PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <PlatformTarget>x64</PlatformTarget>
    <PublishSingleFile>true</PublishSingleFile>
    <SelfContained>true</SelfContained>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" />
  </ItemGroup>
</Project>
Program.cs
using MyService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options => options.ServiceName = ".NET Joke Service");

LoggerProviderOptions.RegisterProviderOptions<
    EventLogSettings, EventLogLoggerProvider>(builder.Services);

builder.Services.AddHostedService<Worker>();

IHost host = builder.Build();
host.Run();
Worker.cs
namespace MyService;

using System;
using System.IO;
using System.Runtime.InteropServices;

public class Worker : BackgroundService
{
    [DllImport("Dll1.dll")]
    public static extern void CallProc();

    private readonly ILogger<Worker> _logger;
    private readonly string _flgFileName = "a.flg";
    private readonly string _exeFileName = "a.exe";

    public Worker(ILogger<Worker> logger) => _logger = logger;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        string aflg = Path.Combine("c:/Temp", _flgFileName);
        string aexe = Path.Combine("c:/Temp", _exeFileName);

        try
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);

                if (Path.Exists(aflg))
                {
                    _logger.LogWarning("flag file exists");

                    var file = new FileInfo(aexe);
                    long size = file.Length;
                    _logger.LogInformation("file size1: {0} bytes", size);

                    using (var sr = new StreamReader(aflg))
                    {
                        string line = sr.ReadLine();
                        if (long.TryParse(line, out long s))
                        {
                            _logger.LogInformation("file size*2: {0} bytes", s);

                            // โ˜… flgใƒ•ใ‚กใ‚คใƒซใฎๅ†…ๅฎนใŒๆญฃๅฝ“ใงใชใ‘ใ‚Œใฐ
                            // ๆ‚ชๆ„ใ‚ใ‚‹ๆ“ไฝœใจใฟใชใ—ใฆใ€ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅฎŸ่กŒใ•ใ›ใชใ„
                            if (size * 2 == s) 
                            {
                                CallProc();
                            }
                        }
                    }

                    File.Delete(aflg);
                    _logger.LogInformation("flag file deleted");
                }
                else if (Path.Exists(aexe))
                {
                    try
                    {
                        File.Delete(aexe);
                        _logger.LogInformation("exe file deleted");
                    }
                    catch (UnauthorizedAccessException)
                    {
                        _logger.LogInformation("exe file access denied");
                    }
                    catch (IOException)
                    {
                        _logger.LogInformation("exe file in use");
                    }
                }

                _logger.LogInformation("wait five minutes");
                await Task.Delay(5000, stoppingToken);
            }
        }
        catch (TaskCanceledException)
        {
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "{Message}", ex.Message);
            Environment.Exit(1);
        }
    }
}

ใ‚ตใƒผใƒ“ใ‚นใ‚’Windowsใƒžใ‚ทใƒณใงๅ‹•ใ‹ใ™

ใ‚ณใƒผใƒ‰ใŒๆ›ธใ‘ใŸใ‚‰ใ€ใƒ—ใƒญใ‚ฐใƒฉใƒ ใ‚’็™บ่กŒ(publish)ใ—ใพใ—ใ‚‡ใ†
ใ‚ใ‚‰ใ‹ใ˜ใ‚Cใƒ‰ใƒฉใ‚คใƒ–็›ดไธ‹ใซTempใƒ•ใ‚ฉใƒซใƒ€ใ‚’ไฝœใฃใฆใŠใ„ใฆใใ ใ•ใ„ใญ

ใ‚ณใƒžใƒณใƒ‰ใƒ—ใƒญใƒณใƒ—ใƒˆ๏ผšC#ใ‚ณใƒผใƒ‰ใ‚’็™บ่กŒใ™ใ‚‹
dotnet publish --output "C:\Temp\publish"

ใƒ—ใƒญใ‚ฐใƒฉใƒ ใ‚’็™บ่กŒใ—ใŸใ‚‰ใ€ใ‚ตใƒผใƒ“ใ‚นใซ็™ป้Œฒใ—ใพใ—ใ‚‡ใ†
ใ‚ณใƒžใƒณใƒ‰ใƒ—ใƒญใƒณใƒ—ใƒˆใ‚’็ฎก็†่€…ๆจฉ้™ใง้–‹ใ„ใฆใ€ไธ‹ใฎ๏ผ’่กŒใ‚’ๅฎŸ่กŒใ—ใพใ™

ใ‚ณใƒžใƒณใƒ‰ใƒ—ใƒญใƒณใƒ—ใƒˆ๏ผˆ็ฎก็†่€…ๆจฉ้™๏ผ‰๏ผšใ‚ตใƒผใƒ“ใ‚นใ‚’็™ป้Œฒใ™ใ‚‹
sc.exe create ".NET Joke Service" binpath="C:\Temp\publish\MyService.exe"
net start ".NET Joke Service"

็„กไบ‹ใซใ‚ตใƒผใƒ“ใ‚นใŒ่ตทๅ‹•ใ—ใŸใ‹ใฉใ†ใ‹ใฏใ€ใ‚ตใƒผใƒ“ใ‚นใ‚’่ฆ‹ใ‚Œใฐใ‚ใ‹ใ‚Šใพใ™

image.png

ใ‚นใ‚ฟใƒผใƒˆใ‚ขใƒƒใƒ—ใฎ็จฎ้กžใ‚’่‡ชๅ‹•ใซใ—ใฆใŠใใพใ—ใ‚‡ใ†๏ผˆๅณใ‚ฏใƒชใƒƒใ‚ฏใงๅค‰ๆ›ดใงใใพใ™๏ผ‰
ใƒ‘ใ‚ฝใ‚ณใƒณใŒ่ตทๅ‹•ใ—ใŸใจใใซ่‡ชๅ‹•็š„ใซใ‚ตใƒผใƒ“ใ‚นใ‚‚้–‹ๅง‹ใ™ใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™

C++ใฎใ‚ณใƒผใƒ‰ใ‚‚ๅฟ…่ฆใชใ‚“ใงใ™

C#ใฎใ‚ณใƒผใƒ‰ใ‹ใ‚‰ใฏC++ใฎใ‚ณใƒผใƒ‰ใ‚’ๅ‘ผใ‚“ใงใ„ใพใ™
CallProc()้–ขๆ•ฐใงใ™
้ขๅ€’ใใ•ใ„ใงใ™ใŒใ€C++ใฎใ‚ณใƒผใƒ‰ใ‚‚ใƒ“ใƒซใƒ‰ใ—ใฆpublishใƒ•ใ‚ฉใƒซใƒ€ใซ็ฝฎใ„ใฆใใ ใ•ใ„

C++ใ‚ณใƒผใƒ‰๏ผˆโ–ถใ‚’ๆŠผใ™ใจๅฑ•้–‹ใ™ใ‚‹ใ‚ˆ๏ผ‰
dllmain.cpp
#include <windows.h>
#include <string>
#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

extern "C" __declspec(dllexport) void __stdcall CallProc();

BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,
                      LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

BOOL createProcessAsUser(const std::wstring &app, const std::wstring &param, HANDLE token, DWORD creationFlags)
{
    wchar_t arg[MAX_PATH] = L"";
    wcscpy_s(arg, (param.empty() ? app.c_str() : (app + L" " + param).c_str()));

    WCHAR tmp[64] = L"winsta0\\default";
    STARTUPINFO si = {sizeof(STARTUPINFO), nullptr, tmp};
    PROCESS_INFORMATION pi = {};
    const BOOL retval = CreateProcessAsUser(token, nullptr, arg, nullptr, nullptr, FALSE, creationFlags, nullptr, nullptr, &si, &pi);

    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);

    return retval;
}

void __stdcall CallProc()
{
    DWORD dwSesId = ::WTSGetActiveConsoleSessionId();

    DWORD currentProcessId = GetCurrentProcessId();
    std::cout << "currentProcessId: " << currentProcessId << std::endl;

    HANDLE hProcess = OpenProcess(MAXIMUM_ALLOWED, false, currentProcessId);
    HANDLE hPToken = NULL;

    if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, &hPToken))
    {
        std::cout << "err1" << std::endl;
        CloseHandle(hProcess);
        return;
    }

    SECURITY_ATTRIBUTES sa = {0};
    sa.nLength = sizeof(sa);

    HANDLE hUserTokenDup = NULL;

    if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, &sa, SecurityIdentification, TokenPrimary, &hUserTokenDup))
    {
        std::cout << "err2" << std::endl;
        CloseHandle(hProcess);
        CloseHandle(hPToken);
        return;
    }

    STARTUPINFO si = {0};
    si.cb = sizeof(si);

    DWORD creationFlags = CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS;
    BOOL _ = SetTokenInformation(hUserTokenDup, TokenSessionId, &dwSesId, sizeof(DWORD));
    BOOL retval = createProcessAsUser(L"c:\\Temp\\a.exe", L"", hUserTokenDup, creationFlags);
    std::cout << "retval:" << retval << std::endl;
}
C#ใฎใ‚ณใƒผใƒ‰ใ‹ใ‚‰C++ใ‚’ๅ‘ผใณๅ‡บใ—ใฆใ„ใ‚‹ใจใ“ใ‚
[DllImport("Dll1.dll")]
public static extern void CallProc();

DLLใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใฃใฆใ€publishใซใ‚ณใƒ”ใƒผใ—ใพใ™

ใ‚ณใƒผใƒ‰ใŒๆ›ธใ‘ใŸใ‚‰ใ€Dll1.dllใจใ„ใ†ๅๅ‰ใงๅฎŸ่กŒใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใ‚Šใพใ™
ไฝœใฃใŸใƒ•ใ‚กใ‚คใƒซใฏC:\Temp\publishใซๆ‰‹ใงใ‚ณใƒ”ใƒผใ—ใฆใใ ใ•ใ„

g++ dllmain.cpp -o Dll1.dll -shared -DUNICODE

ใ‚‚ใ—g++ใ‚ณใƒžใƒณใƒ‰ใŒไฝฟใˆใชใ„ๅ ดๅˆใฏใ€ไธ‹่จ˜ใฎใ‚ตใ‚คใƒˆใชใฉใ‚’ๅ‚่€ƒใซใ—ใพใ—ใ‚‡ใ†

ใชใœC++ใ‚’ไฝฟใ†ใฎใ‹๏ผŸ

C#ใ ใ‘ใงๅฎŒ็ตใ—ใชใ„ใฎใ‹๏ผŸ

ใ‚ปใƒƒใ‚ทใƒงใƒณ 0 ๅˆ†้›ข | Windows 7ใจใ„ใ†ใ‚ตใ‚คใƒˆๆง˜ใ‹ใ‚‰๏ผ’ๆฎต่ฝๅผ•็”จใ—ใพใ™

ใƒปWindows 7ใงใฏใƒ—ใƒญใ‚ปใ‚นใ”ใจใซใ‚ปใƒƒใ‚ทใƒงใƒณ ID ใŒๅ‰ฒใ‚Šๅฝ“ใฆใ‚‰ใ‚Œใพใ™ใŒใ€ใ‚ตใƒผใƒ“ใ‚นใ‚„ใ‚ทใ‚นใƒ†ใƒ ใจใ—ใฆ่ตทๅ‹•ใ™ใ‚‹ใƒ—ใƒญใ‚ปใ‚นใฏ ใ‚ปใƒƒใ‚ทใƒงใƒณ ID =0 ใจใ—ใฆ่ตทๅ‹•ใ—ใพใ™ใ€‚ไธ€ๆ–นๅ„ใƒฆใƒผใ‚ถใŒ่ตทๅ‹•ใ™ใ‚‹ใƒ—ใƒญใ‚ปใ‚นใฏ ใ‚ปใƒƒใ‚ทใƒงใƒณ ID =1ไปฅไธŠใจใ—ใฆ่ตทๅ‹•ใ—ใพใ™ใ€‚

ใพใŸใ‚ปใƒƒใ‚ทใƒงใƒณ 0 ใฏใƒฆใƒผใ‚ถใ‚คใƒณใ‚ฟใƒผใƒ•ใ‚งใƒผใ‚น(Windows ใฎใƒใƒƒใƒ—ใ‚ขใƒƒใƒ—็”ป้ขใชใฉ๏ผ‰ใ‚’่กจ็คบใ•ใ›ใ‚‹ใ“ใจใฏๅ‡บๆฅใชใใชใ‚Šใพใ—ใŸใ€‚ใ‚ˆใฃใฆใ‚ตใƒผใƒ“ใ‚นใƒ—ใƒญใ‚ฐใƒฉใƒ ใŒใƒฆใƒผใ‚ถใซใƒใƒƒใƒ—ใ‚ขใƒƒใƒ—็”ป้ขใ‚’่กจ็คบใ™ใ‚‹ใ“ใจใฏๅ‡บๆฅใชใใชใ‚Šใพใ—ใŸใ€‚

ใ‚ตใƒผใƒ“ใ‚นใŒ่ตทๅ‹•ใ—ใŸใƒ—ใƒญใ‚ปใ‚นใฏใ€็”ป้ขใŒ่กจ็คบใ•ใ‚Œใชใ„ใฎใงใ™ใญ
๏ผˆๅฎŸ้š›ใซใ‚„ใฃใฆใฟใพใ—ใŸใŒใ€ใ‚ฟใ‚นใ‚ฏใƒžใƒใƒผใ‚ธใƒฃใƒผใซใƒ—ใƒญใ‚ปใ‚นใฏใ‚ใ‚‹ใ‚‚ใฎใฎใ€็”ป้ขใฏใŸใ—ใ‹ใซ่กจ็คบใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸ๏ผ‰
็”ป้ขใŒ่ฆ‹ใ‚Œใชใ„ใจใƒฆใƒผใ‚ถใƒผใฏๅพŒ็ถšใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซไฝœๆฅญใŒใงใใพใ›ใ‚“

็”ป้ขใ‚’่กจ็คบใ™ใ‚‹ใŸใ‚ใซใฏใ€ใƒฆใƒผใ‚ถใƒผใ‚ปใƒƒใ‚ทใƒงใƒณใงใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅฎŸ่กŒใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Š
ใใฎ้–ขๆ•ฐใ‚’็ฐกๅ˜ใซๆไพ›ใ—ใฆใใ‚Œใ‚‹ใฎใŒC++ ใ ใฃใŸใฎใงใ€ไปŠๅ›žC++ใ‚’ไฝฟใ„ใพใ—ใŸ

ๅ‚่€ƒใƒชใƒณใ‚ฏใงใฏC#ใงๅŒๆฉŸ่ƒฝใ‚’ๅฎŸ็พใ—ใฆใ„ใ‚‹ไพ‹ใ‚‚ใ‚ใ‚Šใพใ™ใŒ
็งใฎใƒ—ใƒญใ‚ฐใƒฉใƒŸใƒณใ‚ฐใ‚นใ‚ญใƒซใงใฏC#ใงใฎๅฎŸ่ฃ…ใฏ้›ฃใ—ใ‹ใฃใŸใงใ™

้•ทใใชใ‚Šใพใ—ใŸใŒใ€ไปฅไธŠใŒไปŠๅ›žC++ใ‚’ไฝฟใฃใŸ็†็”ฑใงใ™

ใ‚ใจไธ€ๆฏใ€ๆœฌ็‰ฉใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ใƒฉใƒƒใƒ—ใ—ใŸEXEใ‚’ใคใใ‚Šใพใ™

IExpressใงๆœฌ็‰ฉใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใจใ‚ณใƒžใƒณใƒ‰ใƒ•ใ‚กใ‚คใƒซใ‚’ใƒฉใƒƒใƒ—ใ—ใพใ™
ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใŒใƒ€ใƒ–ใƒซใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹ๅฏพ่ฑกใจใชใ‚‹ใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ใคใใ‚‹ๅทฅ็จ‹ใงใ™

IExpressใงEXEใƒ•ใ‚กใ‚คใƒซใ‚’ไฝœใฃใฆใ€ใใฎEXEใ‚’ใŸใŸใใจ
ใใฎไธญใซใ„ใ‚‹ๆœฌ็‰ฉใฎใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผ(a.exe)ใŒๅฎŸ่กŒใ•ใ‚Œใ‚‹
ใจใ„ใ†็ฎ—ๆฎตใงใ™

CMDใ‚ณใƒผใƒ‰๏ผˆโ–ถใ‚’ๆŠผใ™ใจๅฑ•้–‹ใ™ใ‚‹ใ‚ˆ๏ผ‰
@REM 2023.10

echo "IEXPRESS: extract the installer"
powershell sleep 1

if exist c:\Temp\a.flg (
    echo flg file exists, exit
    powershell sleep 1
    exit
)

if exist c:\Temp\a.exe (
    echo exe file exists, exit
    powershell sleep 1
    exit
)

copy a.exe c:\Temp\
copy a.flg c:\Temp\
@REM powershell (Get-Item a.exe).Length > c:\Temp\a.flg
@REM type nul > %TEMP%\a.flg

echo "IEXPRESS: finish to 1 sec"

powershell sleep 1
@REM REM pause

ๅ…ˆใซไฝ•ใ‹ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚‰ๅ‹•ใ„ใฆใ„ใชใ„ใ‹ใ€flgใƒ•ใ‚กใ‚คใƒซใฎๆœ‰็„กใง็ขบ่ชใ—ใพใ™
ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใฏ๏ผ‘ใคใšใคๅฎŸ่กŒใ—ใฆใ‚‚ใ‚‰ใ†ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™

ๆ‚ชๆ„ใฎใ‚ใ‚‹่กŒๅ‹•ใธใฎๅฏพๅ‡ฆ

flgใƒ•ใ‚กใ‚คใƒซใซใฏใ‚ใ‚‰ใ‹ใ˜ใ‚็ฎก็†่€…ใŒใ“ใฃใใ‚Š
ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚ตใ‚คใ‚บใฎ2ๅ€ใฎๅ€คใ‚’ๆ›ธใ่พผใ‚“ใงใŠใใพใ™

ใ“ใ‚Œใฏใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใŒ็ขบใ‹ใซIExpressใงๅŒ…ใ‚“ใ ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใงใ‚ใ‚‹ใ“ใจใ‚’็ขบใ‹ใ‚ใ‚‹ใŸใ‚ใฎๅฎ‰ๅ…จ็ขบ่ชใงใ™

C#ใ‚ตใƒผใƒ“ใ‚นใงใ‚‚ใ€ๅŒๆง˜ใซใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใฎใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใ‚’็ขบ่ชใ—
ใใฎ2ๅ€ใฎๅ€คใŒflgใƒ•ใ‚กใ‚คใƒซใฎๅ†…ๅฎนใจๅˆ่‡ดใ™ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใพใ™

ๆ‚ชๆ„ใ‚’ๆŒใฃใŸๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใŒใ€ใ‚ตใƒผใƒ“ใ‚นใฎ็›ฃ่ฆ–ใƒ•ใ‚ฉใƒซใƒ€ใซใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผ๏ผˆsetup.exeใฎใ‚ˆใ†ใชใ‚‚ใฎ๏ผ‰ใจflgใƒ•ใ‚กใ‚คใƒซใ‚’็ฝฎใใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“
ใ‚ตใƒผใƒ“ใ‚นใฏ็›ฃ่ฆ–ๅฏพ่ฑกใƒ•ใ‚ฉใƒซใƒ€ใซใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใŒใ‚ใ‚ŒใฐๅฎŸ่กŒใ—ใพใ™

ใใฎๆ™‚ใซใ€ใƒ•ใƒฉใ‚ฐใƒ•ใ‚กใ‚คใƒซใฎไธญ่บซใŒใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚ตใ‚คใ‚บใฎ2ๅ€ใงใชใ„ๅ ดๅˆใฏ
ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’็ ดๆฃ„ใ—ใพใ™๏ผ๏ผ

ใ“ใฎใ‚ˆใ†ใชไป•ๆŽ›ใ‘ใ‚’ๅ…ฅใ‚ŒใฆใŠใใ“ใจใงใ€ๆ‰‹ไฝœๆฅญใซใ‚ˆใ‚‹ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใฎ้…็ฝฎใ‚’็„กๅŠนใซใ—ใพใ™

ใ‚‚ใกใ‚ใ‚“ใ“ใฎNๅ€ใฏ็ฎก็†่€…ใ ใ‘ใงๅ…ฑๆœ‰ใ™ในใ็ง˜ๅฏ†ไบ‹้ …ใงใ™

ใกใ‚ƒใ‚“ใจใ—ใŸใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ

้›ปๅญ็ฝฒๅใ‚„ใ‚‰้ตๆš—ๅทใชใฉใงใ‚ฌใƒƒใƒใƒชใจๆญฃๅฝ“ใชใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๅˆคๅˆฅใ™ใ‚Œใฐใ‚ˆใ‚Šๅฎ‰ๅ…จใงใ™ใŒ
ใใ‚“ใชๅคง้‰ˆใ‚’ๆŒฏใ‚‹ใ‚ใชใใจใ‚‚ใ€ใ€Œใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใฎNๅ€ใฎๅ€คใŒflgใซๆ›ธใ่พผใพใ‚Œใฆใ„ใ‚‹ใ€ใใ‚‰ใ„ใฎ
็ด„ๆŸใ ใ‘ใงใ‚‚ใฒใจใพใšใฏไบบ้–“ใฎ่„ณๅ†…ใƒ—ใƒญใ‚ปใƒƒใ‚ตใงใฏ็ ดใ‚Œใชใ„ใใ‚‰ใ„ใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฏใคใใ‚Œใพใ™

// ๅ…ƒใฎใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใฎ2ๅ€ใฎๅ€คใŒ flg ใƒ•ใ‚กใ‚คใƒซใซๆ›ธใ่พผใพใ‚Œใฆใ„ใŸใ‚‰
// C++ใฎๅ‡ฆ็†ใซ็งปๅ‹•ใ—ใ€ๅฎŸ้š›ใซใ‚คใƒณใ‚นใƒˆใƒผใƒซไฝœๆฅญใ‚’ๅฎŸๆ–ฝใ™ใ‚‹
if (size * 2 == s)
{
    CallProc();
}
// ็ฐกๅ˜ใฎใŸใ‚ใซ2ๅ€ใ‚’ๆŽก็”จใ—ใŸใŒใ€17ๅ€ใ ใ‚ใ†ใŒใ€8ๅ€ใ—ใฆ2ใƒžใ‚คใƒŠใ‚นใ—ใŸๅ€คใงใ‚‚ใ‚ˆใ„
// ใŸใ ใ—ใ€ๅฐ‘ๆ•ฐใฎๆ‰ฑใ„ใ‚„ใ‘ใŸ่ฝใกใชใฉใซๆณจๆ„ใ™ใ‚‹ใ“ใจ

ๅ‹•ไฝœ็ขบ่ช

  1. ็ฎก็†่€…ใงใ‚ตใƒผใƒ“ใ‚นใ‚’่ตทๅ‹•ใ—ใพใ™
  2. ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใซๅˆ‡ใ‚Šๆ›ฟใˆใพใ™
  3. ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใงใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผ(.EXE)ใ‚’ใƒ€ใƒ–ใƒซใ‚ฏใƒชใƒƒใ‚ฏใ—ใพใ™
  4. C:\Tempใซa.exeใจa.flgใŒ็”Ÿๆˆใ•ใ‚Œใพใ™
  5. ใ‚ตใƒผใƒ“ใ‚นใŒa.flgใฎไธญ่บซใจa.exeใฎใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใ‚’ๆฏ”่ผƒใ—ใ€a.exeใฎ็œŸๆญฃๆ€งใ‚’็ขบ่ชใ—ใพใ™
  6. ใ‚ตใƒผใƒ“ใ‚นใŒ็ฎก็†่€…ๆจฉ้™ใงa.exeใ‚’ๅฎŸ่กŒใ—ใพใ™
  7. ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใŒ่ตทๅ‹•ใ™ใ‚‹ใฎใงใ€ใ‚ใจใฏๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใŒGUIใ‹ใ‚‰ๆ“ไฝœใ—ใ€ใ‚คใƒณใ‚นใƒˆใƒผใƒซไฝœๆฅญใ‚’้€ฒใ‚ใพใ™
  8. ไปฅไธŠ๏ผ

ใ‚ตใƒผใƒ“ใ‚นใ‚’่‡ชๅ‹•่ตทๅ‹•ใ—ใฆใŠใ‘ใฐใ€ๆ‰‹้ †1ใฏไธ่ฆใงใ™
ใƒžใ‚ทใƒณใ‚’ๅ†่ตทๅ‹•ใ™ใ‚Œใฐๅ‹ๆ‰‹ใซใ‚ตใƒผใƒ“ใ‚นใŒ็ซ‹ใกไธŠใŒใฃใฆใ„ใ‚‹็Šถๆ…‹ใชใฎใง
ๆƒ…ใ‚ทใ‚นใ•ใ‚“ใฏใƒฉใƒƒใƒ—ใ‚คใƒณใ‚นใƒˆใƒผใƒฉใƒผใ‚’ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใซๆธกใ—ใฆใ‚ใ’ใ‚‹ใ ใ‘ใงใ€ๆฎ‹ใ‚Šใฎใ‚คใƒณใ‚นใƒˆใƒผใƒซไฝœๆฅญใฏ
ๅธธ้งใ‚ตใƒผใƒ“ใ‚นใจใƒฆใƒผใ‚ถใƒผๆ“ไฝœใ ใ‘ใงๅฎŒ็ตใ—ใพใ™

ๅพŒ็‰‡ไป˜ใ‘

ใ‚ตใƒผใƒ“ใ‚นใ‚’ๅœๆญขใ—ใฆใ€ใ‚ตใƒผใƒ“ใ‚นใƒชใ‚นใƒˆใ‹ใ‚‰้™คๅใ—ใพใ—ใ‚‡ใ†

ใ‚ณใƒžใƒณใƒ‰ใƒ—ใƒญใƒณใƒ—ใƒˆ๏ผˆ็ฎก็†่€…ๆจฉ้™๏ผ‰
net stop  ".NET Joke Service"
sc.exe delete ".NET Joke Service"

ใŠใ‚ใ‚Šใซ

ใ™ใ“ใ—C#ใจC++ใ‚’ๆ›ธใ‘ใฐ
ๆจ™ๆบ–ใƒฆใƒผใ‚ถใƒผใซใ‚คใƒณใ‚นใƒˆใƒผใƒซไฝœๆฅญใ‚’ๅง”ไปปใงใใใ†ใ 
ใจใ„ใ†ใ“ใจใŒใ‚ใ‹ใ‚Šใพใ—ใŸ

ใ€Œใ“ใ‚ŒใŒใƒชใ‚นใ‚ฏใงใฏใชใ„ใ‹๏ผŸใ€ใชใฉใ‚ณใƒกใƒณใƒˆใŠๅพ…ใกใ—ใฆใŠใ‚Šใพใ™๏ผ

ใ™ในใฆใฎๆƒ…ใ‚ทใ‚นใ•ใ‚“ใŒใ™ใ“ใ—ใงใ‚‚ๆ—ฉใใŠใ†ใกใซๅธฐใ‚Œใพใ™ใ‚ˆใ†ใซ๏ผ

ๅ‚่€ƒใƒชใƒณใ‚ฏ

ใŠไธ–่ฉฑใซใชใ‚Šใพใ—ใŸ

ๅ•†็”จใ‚ฝใƒ•ใƒˆ

ใ“ใฎ่จ˜ไบ‹ใฎใ‚ˆใ†ใชใ‚คใƒณใƒใ‚ญๆ‰‹ๆณ•ใฏ็คพๅ†…็จŸ่ญฐใ‚’้€šใ‚‹ใ‚ใ‘ใชใ„๏ผ
ใจใ„ใ†ๅ ดๅˆใฏใ€ใŠ้‡‘ใง่งฃๆฑบใ—ใพใ—ใ‚‡ใ†

ไป˜้Œฒ

CreateProcessAsUserใฏUNICODEใฎไฝฟ็”จ/ไธไฝฟ็”จใซใ‚ˆใฃใฆๅฎŸ่ฃ…ใŒๅค‰ใ‚ใ‚‹ใ‚ˆใ†ใงใ™
ๆœซๅฐพAใจWใงๅˆ†ใ‹ใ‚Œใพใ™

ไปŠๅ›žใฎใ‚ˆใ†ใชๆ—ฅๆœฌ่ชžใ‚’ไฝฟใ‚ใชใ„ใƒ‘ใ‚นใ—ใ‹ไฝฟใ‚ใชใ„ใฎใงใ‚ใ‚Œใฐ
ๆœซๅฐพAใฎใปใ†ใŒใ‚ทใƒณใƒ—ใƒซใงๆ‰ฑใ„ใ‚„ใ™ใ„ใฎใงใ™ใŒใ€ใ€ใ€
ใใ‚ŒใฏไปŠๅพŒใฎ่ชฒ้กŒใจใ„ใ†ใ“ใจใงใ€‚

CreateProcessAsUserA(
    _In_opt_ HANDLE hToken,
    _In_opt_ LPCSTR lpApplicationName,
    _Inout_opt_ LPSTR lpCommandLine,
    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
    _In_ BOOL bInheritHandles,
    _In_ DWORD dwCreationFlags,
    _In_opt_ LPVOID lpEnvironment,
    _In_opt_ LPCSTR lpCurrentDirectory,
    _In_ LPSTARTUPINFOA lpStartupInfo,
    _Out_ LPPROCESS_INFORMATION lpProcessInformation
    );
#ifdef UNICODE
#define CreateProcessAsUser  CreateProcessAsUserW
#endif
CreateProcessAsUserW(
    _In_opt_ HANDLE hToken,
    _In_opt_ LPCWSTR lpApplicationName,
    _Inout_opt_ LPWSTR lpCommandLine,
    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
    _In_ BOOL bInheritHandles,
    _In_ DWORD dwCreationFlags,
    _In_opt_ LPVOID lpEnvironment,
    _In_opt_ LPCWSTR lpCurrentDirectory,
    _In_ LPSTARTUPINFOW lpStartupInfo,
    _Out_ LPPROCESS_INFORMATION lpProcessInformation
    );

้–ขๆ•ฐ Typedef ๅฎš็พฉ
ๆœซๅฐพA LPCSTR const char*
ๆœซๅฐพW LPCWSTR const wchar_t*

็ณธๅ†ฌไบ†๏ผ๏ผ

่ฟฝ่จ˜(2024.02.13)

  • a.exeใงใฏใชใใƒใƒƒใƒใƒ•ใ‚กใ‚คใƒซใ‚’็ฎก็†่€…ๆจฉ้™ใงๅฎŸ่กŒใ—ใŸใ„ๅ ดๅˆใฏใ€a.exeใ‚’a.batใง็ฝฎๆ›ใ™ใ‚‹
  • a.batใฎใƒ•ใ‚กใ‚คใƒซใ‚ตใ‚คใ‚บใ‚’ใƒ—ใƒญใƒ‘ใƒ†ใ‚ฃใง็ขบ่ชใ—ใฆใ€ใใฎๅ€ใฎๅ€คใ‚’a.flgใซๆ›ธใ่พผใ‚“ใงใŠใ
  • a.batๅฎŸ่กŒๆ™‚ใ€้ป’ใ„DOS็ช“ใŒ้–‹ใ„ใฆใ™ใใซ้–‰ใ˜ใฆใ—ใพใ†ใจใ€ใƒฆใƒผใ‚ถใƒผใŒใ€Œใ‚ใ‚Œ๏ผŸไปŠๅ‹•ใ„ใŸใ‹ใช๏ผŸใ€ใจๆˆธๆƒ‘ใฃใฆใ—ใพใ†ใฎใงใ€a.batใฎๆœซๅฐพใซpauseใ‚’ๅ…ฅใ‚ŒใฆใŠใใจ่ฆชๅˆ‡๐Ÿ’›

PINGๅฟœ็ญ”ใซๅฟœใ˜ใฆbatใƒ•ใ‚กใ‚คใƒซใฎๅ‡ฆ็†ใ‚’ๅˆ†ๅฒใ™ใ‚‹

ใŸใจใˆใฐ็›ฃ่ฆ–ๅฏพ่ฑกใฎใƒ›ใ‚นใƒˆใ‹ใ‚‰PINGๅฟœ็ญ”ใŒใ‚ใฃใŸๅ ดๅˆใซใฎใฟไฝ•ใ‹ใฎๅ‡ฆ็†ใ‚’ใ™ใ‚‹ๅ ดๅˆ
:erroroutใฎใจใ“ใ‚ใซPINGๅฟœ็ญ”ใŒใ‚ใฃใŸๅ ดๅˆใฎๅ‡ฆ็†ใ‚’ๆ›ธใ

PINGๅฟœ็ญ”ใซๅฟœใ˜ใฆๅ‡ฆ็†ใ‚’ๅค‰ๆ›ดใ™ใ‚‹
@echo off

set COUNT=0

:error
set /a COUNT=COUNT+1
echo COUNTDOWN ... %COUNT%/3
if "%COUNT%" == "3" goto errorout
ping -n 1 192.168.10.1 | find "ms TTL=" > NUL
if ERRORLEVEL 1 goto notrespond
timeout /t 5  > nul
goto error

:notrespond
echo (PING ERROR) CANNOT RESTART HOST
goto end

:errorout
echo (OK) RESTART 192.168.10.1

:end
echo ---END---
pause

19
17
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

@t13801206's pickup articles

t13801206

@t13801206(ใƒกใ‚ค ้•ท้‡Ž)

๐Ÿฆ€Rust๐Ÿฆ€๏ฝœAWSๅ‹‰ๅผทไธญ๏ฝœGithub Copilotไพๅญ˜ไธญ๏ฝœใ€Œ่ชคๅญ—ใ‚’ไฟฎๆญฃใ—ใพใ—ใŸใ€ใจ็ทจ้›†ใƒชใ‚ฏใ‚จใ‚นใƒˆใ‚’้€ใ‚‰ใ›ใฆใ„ใŸใ ใใ“ใจใŒใ‚ใ‚Šใพใ™ใ€‚

Today's trending articles

Comments

@tenmyo
(Edited)

่ˆˆๅ‘ณๆทฑใ„ใงใ™ใ€‚
ไปŠใฏ5ๅˆ†็ง’้–“้š”ใงใƒใƒผใƒชใƒณใ‚ฐใ—ใฆใ‚‹ใ‚“ใ˜ใ‚ƒใชใ„ใ‹ใจๆ€ใ„ใพใ™ใŒใ€FileSystemWatcher ใ‚ฏใƒฉใ‚น (System.IO)ใŒไฝฟใˆใ‚‹ใ‹ใ‚‚็Ÿฅใ‚Œใพใ›ใ‚“ใ€‚

1

@tenmyo
ใ‚ณใƒกใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
ใƒžใ‚คใ‚ฏใƒญใ‚ฝใƒ•ใƒˆใฎใ‚ตใƒณใƒ—ใƒซใŒwhileใจawait Task.Delay()ใฎ็ต„ใฟๅˆใ‚ใ›ใ ใฃใŸใŸใ‚
็‰นใซๆทฑใ่€ƒใˆใš่ธ่ฅฒใ—ใพใ—ใŸใŒใ€ใ”ๆŒ‡ๆ‘˜ใฎwatcherใ‚’ไฝฟใฃใŸๆ–นๆณ•ใฎใปใ†ใŒใ‚ˆใ•ใใ†ใงใ™ใญ

ใจใ„ใ†ใ“ใจใงใ€ใ‚ถใ‚ถใฃใจๆ›ธใ„ใฆใฟใŸใฎใงใ™ใŒใ€ๅ‹•ใ‹ใš๏ผพ๏ผพ๏ผ›
ๅ˜ใชใ‚‹ใ‚ฑใ‚ขใƒฌใ‚นใƒŸใ‚นใชใฎใ‹ใ‚‚ใ—ใ‚Œใพใ›ใ‚“ใŒใ€ใ‚‚ใ†ๅฐ‘ใ—ใกใ‚ƒใ‚“ใจ่ชฟในใชใ„ใจใงใ™
ไปฅไธŠใ€ๅพก็คผใจใ€ใ„ใ‚‰ใ‚“ใ”ๅ ฑๅ‘Šใพใง

ใŸใ‚ใ—ใซๅค‰ๆ›ดใ—ใฆใฟใŸ
namespace MyService;

using System;
using System.IO;
using System.Runtime.InteropServices;

public class Worker : BackgroundService
{
    [DllImport("Dll1.dll")]
    public static extern void CallProc();

    private readonly ILogger<Worker> _logger;
    private readonly string _aflg = Path.Combine(@"C:\Temp\a.flg");
    private readonly string _aexe = Path.Combine(@"C:\Temp\a.exe");
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogWarning("Worker running at: {time}", DateTimeOffset.Now);
    }

    public Worker(ILogger<Worker> logger)
    {
        _logger = logger;
        using var watcher = new FileSystemWatcher(@"C:\Temp");
        watcher.NotifyFilter = NotifyFilters.Attributes
                             | NotifyFilters.CreationTime
                             | NotifyFilters.DirectoryName
                             | NotifyFilters.FileName
                             | NotifyFilters.LastAccess
                             | NotifyFilters.LastWrite
                             | NotifyFilters.Security
                             | NotifyFilters.Size;

        watcher.Created += OnCreated;
        watcher.IncludeSubdirectories = true;
        watcher.EnableRaisingEvents = true;
    }

    private void OnCreated(object sender, FileSystemEventArgs e)
    {
        try
        {
            _logger.LogWarning("*.flg file created at: {time}", DateTimeOffset.Now);

            if (Path.Exists(_aflg))
            {
                _logger.LogWarning("flag file exists");

                var file = new FileInfo(_aexe);
                long size = file.Length;
                _logger.LogInformation("file size: {0} bytes", size);

                using (var sr = new StreamReader(_aflg))
                {
                    string line = sr.ReadLine();
                    if (long.TryParse(line, out long s))
                    {
                        _logger.LogInformation("file size*2: {0} bytes", s);
                        if (size * 2 == s)
                        {
                            CallProc();
                        }
                    }
                }

                File.Delete(_aflg);
                _logger.LogInformation("flag file deleted");
            }
            else if (Path.Exists(_aexe))
            {
                try
                {
                    File.Delete(_aexe);
                    _logger.LogInformation("exe file deleted");
                }
                catch (UnauthorizedAccessException)
                {
                    _logger.LogInformation("exe file access denied");
                }
                catch (IOException)
                {
                    _logger.LogInformation("exe file in use");
                }
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "{Message}", ex.Message);
            Environment.Exit(1);
        }
    }
}
1
@tenmyo

่ฉณใ—ใใชใ„ใฎใงใ™ใŒusing var watcherใ ใจไฝœใฃใฆๅณ่งฃๆ”พใ—ใฆใพใ›ใ‚“ใ‹

1

ใ‚นใ‚ณใƒผใƒ—ๅ†…ใงใฏ็”Ÿใ็ถšใ‘ใพใ™ใŒใ€ใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟๆŠœใ‘ใŸใ‚‰็ ดๆฃ„ใ•ใ‚Œใฆใใ†ใงใ™ใญ
ใƒ’ใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ

1

Console.ReadLine()ใงใƒ–ใƒญใƒƒใ‚ญใƒณใ‚ฐใ—ใฆใ„ใ‚‹ใฎใ‹ใƒปใƒปใƒป

0
@juner

JokeService ใฏๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใใชใ„ใงใ™ใ‹โ€ฆโ€ฆ๏ผŸ

1
t13801206
@t13801206(ใƒกใ‚ค ้•ท้‡Ž)
(Edited)

๐Ÿ‘‡ใ“ใ“ใพใ‚‹ใฃใจไธ่ฆใงใ™ใญใ€‚ใ”ๆŒ‡ๆ‘˜ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ

builder.Services.AddSingleton();

0
@juner

๐Ÿ‘‡ใ“ใ“ใพใ‚‹ใฃใจไธ่ฆใงใ™ใญใ€‚ใ”ๆŒ‡ๆ‘˜ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™๏ผ

builder.Services.AddSingleton<JokeService>();

ใใƒผใงใ™ใ€‚ใใƒผใงใ™ใ€‚

1

ใ”ๆŒ‡ๆ‘˜้ƒจๅˆ†ใ‚’ๅ‰Š้™คใ—ใพใ—ใŸ

1
@josys-one

ใจใ‚ใ‚‹ๅŒป็™‚ๆณ•ไบบใฎๆƒ…ใ‚ทใ‚นใงใ™ใ€‚ใจใฆใ‚‚่ˆˆๅ‘ณๆทฑใ่จ˜ไบ‹ใ‚’ๆ‹่ฆ‹ใ„ใŸใ—ใพใ—ใŸใ€‚ๆ„Ÿ่ฌ็”ณใ—ไธŠใ’ใพใ™ใ€‚ๅฎŸ้š›ใซ่ฉฆใ—ใฆใฟใŸใจใ“ใ‚ใ€ๅฎŸ่กŒ็’ฐๅขƒใงใฏไพๅญ˜ใ—ใฆใ„ใ‚‹DLLใŒใชใ„ใŸใ‚ใ‚ตใƒผใƒ“ใ‚นใŒ่ตทๅ‹•ใ—ใชใ„ใฎใง้™็š„ใƒชใƒณใ‚ฏใŒๅฟ…่ฆใจๆ€ใ„ใพใ™ใ€‚
g++ dllmain.cpp -o Dll1.dll -shared -DUNICODE
ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€ใ€€โ†“
g++ dllmain.cpp -o Dll1.dll -static -lstdc++ -lgcc -lwinpthread -shared -DUNICODE
โ€ปใ“ใกใ‚‰ใฎ่จ˜ไบ‹ใ‚’ๅ‚่€ƒใซใ•ใ›ใฆใ„ใŸใ ใใพใ—ใŸใ€‚siunใ•ใ‚“ใซใ‚‚ๆ„Ÿ่ฌ็”ณใ—ไธŠใ’ใพใ™ใ€‚
https://siuncyclone.hatenablog.com/entry/2018/07/21/194629

1

Let's comment your feelings that are more than good

19
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address