C++自动获取用户SID,替换%Temp%下task_.xml文件内%SID%,命令行读取task_.xml添加计划任务

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )//隐藏命令行
#include<Windows.h>
#include "stdafx.h"
#include <stdlib.h>
#include<tchar.h>
#include <iostream>
#include <fstream>
#include <string>
#include<taskschd.h>
using namespace std;

string xml = "1";


#define MAX_NAME 260
void file_replace(FILE* fp_in, FILE* fp_out, char* src, char* dst)

{

    char c = fgetc(fp_in);

    char tmp[100];

    int count = 0;

    while (c != EOF)

    {

        int pPos = 0;

        if (c != src[pPos])

        {

            fputc(c, fp_out);

            c = fgetc(fp_in);

            continue;//如果当前字符不相等,继续下一个字符

        }

        memset(tmp, 0, 100);

        while (c == src[pPos])

        {

            tmp[pPos] = c;

            c = fgetc(fp_in);

            pPos++;//相等的部分跳过

        }

        if (src[pPos] == '\0')

        {

            count++;

            printf("源串已找到!替换%d处\n", count);

            fputs(dst, fp_out);

            continue;

        }

        else

        {

            fputs(tmp, fp_out);

            continue;//如果当前字符不相等,继续下一个字符

        }

    }

    return;

}


int main() {
    char userName[MAX_NAME] = "";
    char sid[MAX_NAME] = "";
    DWORD nameSize = sizeof(userName);
    GetUserName((LPWSTR)userName, &nameSize);


    char userSID[MAX_NAME] = "";
    char userDomain[MAX_NAME] = "";
    DWORD sidSize = sizeof(userSID);
    DWORD domainSize = sizeof(userDomain);


    SID_NAME_USE snu;
    LookupAccountName(NULL,
        (LPWSTR)userName,
        (PSID)userSID,
        &sidSize,
        (LPWSTR)userDomain,
        &domainSize,
        &snu);


    PSID_IDENTIFIER_AUTHORITY psia = GetSidIdentifierAuthority(userSID);
    sidSize = sprintf(sid, "S-%lu-", SID_REVISION);
    sidSize += sprintf(sid + strlen(sid), "%-lu", psia->Value[5]);


    int i = 0;
    int subAuthorities = *GetSidSubAuthorityCount(userSID);
//获取SID完毕
//更换SID
    for (i = 0; i < subAuthorities; i++)
    {
        sidSize += sprintf(sid + sidSize, "-%lu", *GetSidSubAuthority(userSID, i));
    }

    char * temppath = getenv("temp");
    char xmlname[100] = "\\task_.xml";
    char path[100];
    strcpy(path, temppath);
    strcat(path, xmlname);
    cout << path << endl;
    printf_s(path);//拼接临时目录和任务xml路径

    //char path[100] = "C:\\Users\\Administrator\\source\\repos\\Project15\\Release\\1.xml";//xml任务路径
    char old_path[100];
    strcpy(old_path, path);
    FILE* fp_in;
    FILE* fp_out;
    fp_in = fopen(path, "rt");
    fp_out = fopen(strcat(path, ".bak"), "wt");
    if (!fp_in || !fp_out)
    {
        printf("File open error!");
    }
    char src[100] = "%SID%";
    char* dst = (sid);
    file_replace(fp_in, fp_out, src, dst);
    fclose(fp_in);
    fclose(fp_out);
    char cmd[200] = "copy ";
    strcat(cmd, path);
    strcat(cmd, " ");
    strcat(cmd, old_path);
    system(cmd);
    memset(cmd, 0, 200);
    strcat(cmd, "del ");
    strcat(cmd, path);
    system(cmd);
    
    system("schtasks /create /xml %USERPROFILE%\\AppData\\Local\\Temp\\task_.xml /tn Apanel_task");//xml任务路径和任务名
    //WinExec("cmd /c schtasks /create /xml %USERPROFILE%\\AppData\\Local\\Temp\\task_.xml /tn Apanel_task", SW_HIDE);//xml任务路径和任务名
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值