This commit is contained in:
陈浩南 2024-07-26 17:30:51 +08:00
parent e0e9ae9ad3
commit 9531f60b05
7 changed files with 41 additions and 34 deletions

View File

@ -86,7 +86,8 @@
overlays = [ inputs.self.overlays.default ];
crossOverlays = [(final: prev:
{
boost = prev.boost.override { zstd = null; };
boost = (prev.boost.override { zstd = null; }).overrideAttrs (prev:
{ patches = prev.patches or [] ++ [ ./local/pkgs/winjob/boost.patch ]; });
magic-enum = prev.magic-enum.overrideAttrs (prev: { cmakeFlags = prev.cmakeFlags ++
[ "-DMAGIC_ENUM_OPT_BUILD_EXAMPLES=OFF" "-DMAGIC_ENUM_OPT_BUILD_TESTS=OFF" ]; });
range-v3 = prev.range-v3.overrideAttrs (prev: { cmakeFlags = prev.cmakeFlags ++
@ -191,7 +192,7 @@
packages = [ pkgs.clang-tools_18 ];
CMAKE_EXPORT_COMPILE_COMMANDS = "1";
};
winjob = pkgs.mkShell.override { stdenv = pkgs.pkgsCross.mingwW64Static.gcc14Stdenv; }
winjob = pkgs.mkShell
{
inputsFrom = [ pkgs.pkgsCross.mingwW64Static.winjob ];
packages = [ pkgs.clang-tools_18 ];

View File

@ -70,7 +70,7 @@ inputs: rec
ufo = inputs.pkgs.callPackage ./ufo
{ inherit concurrencpp biu glad matplotplusplus zpp-bits; tbb = inputs.pkgs.tbb_2021_11; };
chn-bsub = inputs.pkgs.callPackage ./chn-bsub { inherit biu; };
winjob = inputs.pkgs.callPackage ./winjob { stdenv = inputs.pkgs.gcc14Stdenv; };
winjob = inputs.pkgs.callPackage ./winjob {};
sockpp = inputs.pkgs.callPackage ./sockpp.nix { src = inputs.topInputs.sockpp; };
git-lfs-transfer = inputs.pkgs.callPackage ./git-lfs-transfer.nix { src = inputs.topInputs.git-lfs-transfer; };

View File

@ -16,15 +16,14 @@ find_package(Boost REQUIRED COMPONENTS headers filesystem)
find_package(nlohmann_json REQUIRED)
add_executable(winjob src/winjob.cpp src/windows.cpp)
# target_compile_features(winjob PRIVATE cxx_std_26)
target_compile_options(winjob PRIVATE "-std=c++26")
target_compile_features(winjob PRIVATE cxx_std_23)
target_include_directories(winjob PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(winjob PRIVATE Boost::headers Boost::filesystem ws2_32 wsock32)
target_compile_definitions(winjob PRIVATE winjob_VERSION="${winjob_VERSION}")
add_executable(winjobd src/winjobd.cpp src/windows.cpp)
# target_compile_features(winjob PRIVATE cxx_std_26)
target_compile_options(winjobd PRIVATE "-std=c++26")
target_compile_features(winjob PRIVATE cxx_std_23)
target_compile_options(winjobd PRIVATE -fpermissive)
target_include_directories(winjobd PRIVATE ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(winjobd PRIVATE Boost::headers Boost::filesystem ws2_32 wsock32)
target_compile_definitions(winjobd PRIVATE winjob_VERSION="${winjob_VERSION}")

View File

@ -0,0 +1,12 @@
diff --color -ur a/boost/process/v2/detail/impl/utf8.ipp b/boost/process/v2/detail/impl/utf8.ipp
--- a/boost/process/v2/detail/impl/utf8.ipp 2024-07-26 15:50:15.844632780 +0800
+++ b/boost/process/v2/detail/impl/utf8.ipp 2024-07-26 15:50:09.036567016 +0800
@@ -11,7 +11,7 @@
#include <boost/process/v2/error.hpp>
#if defined(BOOST_PROCESS_V2_WINDOWS)
-#include <Windows.h>
+#include <windows.h>
#endif
BOOST_PROCESS_V2_BEGIN_NAMESPACE

View File

@ -1,11 +1,9 @@
# include <optional>
# include <string>
# include <utility>
# include <boost/process/v2.hpp>
namespace winjob
{
std::optional<std::pair<std::wstring, std::wstring>> get_owner(std::wstring file_name);
bool set_permission(std::wstring fileName);
std::unique_ptr<boost::process::child> run_as(std::pair<std::wstring, std::wstring> user, std::wstring program);
}

View File

@ -3,7 +3,6 @@
# include <tchar.h>
# include <accctrl.h>
# include <aclapi.h>
# include <winbase.h>
namespace winjob
{
@ -103,22 +102,4 @@ namespace winjob
{ FreeSid(pUsersSID); LocalFree(pACL); LocalFree(pSD); return false; }
else { FreeSid(pUsersSID); LocalFree(pACL); LocalFree(pSD); return true; }
}
std::unique_ptr<boost::process::child> run_as(std::pair<std::wstring, std::wstring> user, std::wstring program)
{
auto password = L"";
// Initialize the STARTUPINFO structure
STARTUPINFOW si = { sizeof(si) };
PROCESS_INFORMATION pi;
// Create the process as the specified user
BOOL result = CreateProcessWithLogonW
(
user.second.c_str(), user.first.c_str(), password, LOGON_WITH_PROFILE, program.c_str(), NULL, // args
CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi
);
if (!result) return {};
else return new boost::process::child(boost::process::detail::windows::child_handle(pi.hProcess, true));
}
}

View File

@ -1,8 +1,11 @@
# include <boost/asio.hpp>
# include <winjob/windows.hpp>
# include <boost/asio.hpp>
# include <boost/process/v2/windows/with_logon_launcher.hpp>
# include <boost/process/v2/process.hpp>
# include <iostream>
# include <filesystem>
# include <fstream>
# include <windows.h>
using namespace std::literals;
@ -17,18 +20,31 @@ int main()
std::filesystem::create_directories(LR"(C:\ProgramData\winjob\auth)");
winjob::set_permission(LR"(C:\ProgramData\winjob\auth)");
// log file
std::ofstream log(LR"(C:\ProgramData\winjob\log.txt)", std::ios::app);
auto user = winjob::get_owner(LR"(C:\Users\chn\Desktop\winjob.exe)");
if (!user)
{
log << "Failed to get owner\n" << std::flush;
return 1;
}
if (user)
{
log << "Owner: " << user->first << "\\" << user->second << '\n' << std::flush;
auto launcher = boost::process::v2::windows::with_logon_launcher(user->second, L"", user->first,
LOGON_WITH_PROFILE);
boost::asio::io_context ctx;
boost::process::v2::error_code ec;
std::wstring program = LR"(C:\Users\chn\Desktop\winjob.exe)";
auto process = launcher(ctx, ec, program, std::vector<std::wstring>{});
}
boost::asio::io_context io_context;
boost::asio::local::stream_protocol::endpoint ep(LR"(C:\ProgramData\winjob\winjobd.sock)");
boost::asio::local::stream_protocol::endpoint ep(R"(C:\ProgramData\winjob\winjobd.sock)");
boost::asio::local::stream_protocol::acceptor acceptor(io_context, ep, false);
winjob::set_permission(LR"(C:\ProgramData\winjob\winjobd.sock)");
auto user = winjob::get_owner(LR"(C:\Users\chn\Desktop\winjob.exe)");
if (user) winjob::run_as(*user, LR"(C:\Users\chn\Desktop\winjob.exe)");
std::function<void(const boost::system::error_code&, boost::asio::local::stream_protocol::socket)> func =
[&](const boost::system::error_code& ec, boost::asio::local::stream_protocol::socket socket)
{