IPアドレス自動設定一括コード共有
バッチファイルとは、一定の順序でコマンドを集めて実行可能なテキストファイルにしたもので、拡張子はBATまたはCMDです。これらのコマンドを総称してバッチコマンドと呼びます。
豆知識:キーボードのCtrl+Cキーを押すと、バッチプロセスの実行を強制的に終了することができます。
一般に、通常のバッチコマンドは、1行ずつ、上から順に実行される。つまり、コマンドの1行目が実行されて初めて2行目が実行でき、2行目が実行されると3行目が実行できる......といった具合である。では、異なる状況で、異なる確立した操作を実行する必要がある場合、通常の実行ルールは明らかにタスクを完了することができない、このアプリケーションシナリオではどうすればよいのでしょうか?プロセスジャンプの概念を導入する必要があります。つまり、プロセスジャンプ文のgotoを使用するのです。フロージャンプの意味は、デフォルトの実行順序を変更し、特定の位置の特定のブロックに強制的にジャンプさせることである。
なぜgotoとコロンというコマンドを一緒に紹介するのでしょうか?それは、両者は切っても切れない関係にあり、どちらか一方だけではエラーになるからです。 gotoはジャンプコマンドにタグ名をつけたもの、コロンはタグフラグにタグ名をつけたもので、これらをまとめてタグと呼びます。プログラムがgotoまで実行されると、自動的にコロンで定義された部分にジャンプして実行されます(え? 想像してみてください、切っても切れない関係でしょうか)。goto文とタグは互いに響き合い、フロージャンプを実現する上で補完的な役割を担っているのです。
基本を押さえた上で、IPアドレスを自動設定するバッチ処理のコード例を見てみましょう。
-------- CreateProcessEx.h file --------
#ifndef _CREATE_PROCESS_EX_H_
#define _CREATE_PROCESS_EX_H_
#include <windows.h>
#include "tchar.h"
#pragma comment(lib, "shell32")
#pragma comment(lib, "user32")
#pragma comment(lib, "Advapi32.lib")
//Start the process with normal privileges
BOOL CreateProcessLow(TCHAR * lpApplicationName,
TCHAR * lpCommandLine = NULL,
TCHAR * lpDirectory = NULL,
UINTnShow = SW_SHOWNORMAL);
//Start the process with administrator privileges
BOOL CreateProcessHigh(TCHAR * strProcessName,
TCHAR * strCommandLine = NULL,
TCHAR * lpDirectory = NULL,
UINTnShow = SW_SHOWNORMAL);
#endif //_CREATE_PROCESS_EX_H_
-------- CreateProcessEx.h file --------
-------- CreateProcessEx.cpp file --------
#include "CreateProcessEx.h"
#include <string>
using namespace std;
typedef BOOL (WINAPI *F_CreateProcessWithTokenW)(
__in HANDLE hToken,
__in DWORD dwLogonFlags,
__in LPCWSTR lpApplicationName,
__in LPWSTR lpCommandLine,
__in DWORD dwCreationFlags,
__in LPVOID lpEnvironment,
__in LPCWSTR lpCurrentDirectory,
__in LPSTARTUPINFOW lpStartupInfo,
__out LPPROCESS_INFORMATION lpProcessInfo
);
HANDLE DupExplorerToken();
BOOL IsVistaOrLater();
BOOL IsAdminPrivilege();
//Start the process with normal privileges
BOOL CreateProcessLow(TCHAR * lpApplicationName,
TCHAR * lpCommandLine,
TCHAR * lpDirectory,
UINTnShow)
{
if (!IsVistaOrLater()
|| !IsAdminPrivilege())
{
HINSTANCE hRet = ShellExecute(NULL, _T("open"), lpApplicationName, lpCommandLine, lpDirectory, nShow);
return ((int)hRet > 32);
}
HANDLE hToken = DupExplorerToken();
if (hToken == NULL)
return FALSE;
static HMODULE hDll = LoadLibrary(_T("ADVAPI32.dll"));
if (!hDll)
{
CloseHandle(hToken);
return FALSE;
}
F_CreateProcessWithTokenW pfn = (F_CreateProcessWithTokenW)GetProcAddress(hDll, "CreateProcessWithTokenW");
if (!pfn)
{
CloseHandle(hToken);
return FALSE;
}
STARTUPINFO si = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION pi = {0};
BOOL ret = pfn(hToken,
LOGON_WITH_PROFILE,
lpApplicationName,
lpCommandLine,
NORMAL_PRIORITY_CLASS,
NULL,
lpDirectory,
&si,
&pi);
if (ret)
{
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
CloseHandle(hToken);
return ret;
}
//Start the process with administrator privileges
BOOL CreateProcessHigh(TCHAR * lpApplicationName,
TCHAR * lpCommandLine,
TCHAR * lpDirectory,
UINTnShow)
{
#ifdef _UNICODE
wstring command;
#else
string command;
#endif
if (lpCommandLine)
{
command = lpCommandLine;
}
if (IsVistaOrLater()
&& !IsAdminPrivilege())
{
command += _T(" -Admin");
}
HINSTANCE hRet = ShellExecute(NULL, _T("runas"), lpApplicationName, command.c_str(), lpDirectory, nShow);
return ((int)hRet > 32);
}
HANDLE DupExplorerToken()
{
DWORD dwPid = 0;
HWND hwnd = FindWindow(_T("Shell_TrayWnd"), NULL);
if (NULL == hwnd)
return NULL;
GetWindowThreadProcessId(hwnd, &dwPid);
if (dwPid == 0)
return NULL;
HANDLE hExplorer = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPid);
if (hExplorer == NULL)
return NULL;
HANDLE hToken = NULL;
OpenProcessToken(hExplorer, TOKEN_DUPLICATE, &hToken);
CloseHandle(hExplorer);
HANDLE hNewToken = NULL;
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenPrimary, &hNewToken);
CloseHandle(hToken);
return hNewToken;
}
BOOL IsVistaOrLater()
{
OSVERSIONINFOEX version = {sizeof(OSVERSIONINFOEX)};
if (!GetVersionEx((LPOSVERSIONINFO)&version))
{
version.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx((LPOSVERSIONINFO)&version))
{
return FALSE;
}
}
return (version.dwMajorVersion >= 6);
}
BOOL IsAdminPrivilege()
{
BOOL bIsAdmin = FALSE;
BOOL bRet = FALSE;
SID_IDENTIFIER_AUTHORITY idetifier = SECURITY_NT_AUTHORITY;
PSID pAdministratorGroup;
if (AllocateAndInitializeSid(
&idetifier,
2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0,0,0,0,0,0,
&pAdministratorGroup))
{
if (!CheckTokenMembership(NULL, pAdministratorGroup, &bRet))
{
bIsAdmin = FALSE;
}
if (bRet)
{
bIsAdmin = TRUE;
}
FreeSid(pAdministratorGroup);
}
return bIsAdmin;
}
-------- CreateProcessEx.cpp file --------
関連
-
バッチバットは、同じ内容のtxtテキストの最初の列の最後の列に数字を追加する
-
一括リネーム方式
-
ウィンドウは、git update (git pull) を定期的に実行するタスクスケジュールを設定し、実行中の cmd を非表示にします。
-
bat delete evil files of malformed files and malformed directoryメソッド
-
DOSコマンドラインからbatバッチプログラムを使って空のフォルダーをすべて削除する方法
-
JDKの一括インストール/JREのワンクリックインストールとJava環境変数の自動設定
-
バットコードを共有し、ドラッグ&ドロップでファイル情報を取得可能
-
DOS高度活用バッチ処理チュートリアル 第6章 ifコマンドの解説
-
DOSバッチ処理応用チュートリアル 第2章 DOSループ for コマンドの解説
-
dosコマンドでWindowsのスケジュールタスクをインポート/エクスポート
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Windowsのbatスクリプトコマンドを使用してワンクリックでMySQLサービスを開始する方法
-
管理者権限でbatバッチを実行させる方法
-
Windowsのクリップボードに文字列や日付を出力するバッチ処理
-
万年暦(旧暦含む)の一括実装コード
-
Windowsのcmdコマンドラインの入出力リダイレクト問題
-
DOSリダイレクトコマンドの使い方とセキュリティへの応用
-
N日前または指定日時(前後)に作成(または変更)されたファイルをバッチ処理で削除する。
-
リテラシーのためのDosバッチ処理コマンド
-
DOSバッチ処理上級編 第5章 setコマンド詳細編
-
フォルダ内のサブフォルダやファイルを一定時間ごとにすべて削除する方法