挑戦する
次の条件を満たしている場合、自分のアカウントを使用してログインするには、画面をブロックした別のユーザーのセッションを終了できる必要があります。
-しばらくすると画面が自動的にロックされます
-あなたはシステム管理者ではありません
-「高速ユーザー切り替え」を使用する方法はありません
-時間による自動セッション終了は使用できません
そしてまた望ましい:
-実装で黒いコンソールウィンドウが表示されないようにする
解決策
どのような解決策が試みられたか、どのくらいの松葉杖を壊さなければならないかについての話であなたを退屈させませんが、解決策が見つかりました。 このような問題を解決するには、スクリプトを使用するのが最善ですが、今回は不可能だったため、これは常に可能とは限りません。 事実、示された問題を解決するためには、スクリーンセーバーとしてスクリプトを実行する必要がありましたが、スクリーンセーバーにスクリプトをインストールすることはできません。 この問題を解決するために、Cの小さなコードを使用し、次にVBSでスクリプトを実行します。
winexec.cpp
#include "stdio.h" #include "shlwapi.h" void RemoveNewLine (char* str) { char* pos = strrchr(str,'\n'); if (pos) *pos = '\0'; } int main(int argc, char *argv[]) { // Get command line argument if (argc < 2) return 0; if (stricmp(argv[1],"/s")) return 0; // Init vars char config_file[MAX_PATH] = ""; char command[MAX_PATH] = ""; char args[MAX_PATH] = ""; // Get own path and set config_file GetModuleFileName (NULL,config_file,MAX_PATH); PathRemoveExtension (config_file); strcat (config_file,".cfg"); // Read config file FILE* file = fopen (config_file,"r") ; if (file == NULL) { MessageBox (NULL,"Error opening config file",NULL,0); return 1; } fgets (command,MAX_PATH,file); RemoveNewLine (command); fgets (args,MAX_PATH,file); RemoveNewLine (args); // Run process PROCESS_INFORMATION processInformation; STARTUPINFO startupInfo; memset ( &processInformation,0,sizeof (processInformation) ); memset ( &startupInfo,0,sizeof (startupInfo) ); if ( !CreateProcess (command,args,NULL,NULL,0,CREATE_NO_WINDOW,NULL,NULL,&startupInfo,&processInformation) ) { MessageBox (NULL,"ERROR: Create Process failed!",NULL,0); return 1; } // Wait until child process exits. WaitForSingleObject (processInformation.hProcess,INFINITE); // Close process and thread handles. CloseHandle (processInformation.hProcess); CloseHandle (processInformation.hThread); }
winexec.cfg
c:\windows\system32\cscript.exe
cscript.exe c:\windows\winexec.vbs
winexec.vbs
'Create common objects Set WshShell = CreateObject("WScript.Shell") Set WshNetwork = CreateObject("WScript.NetWork") 'Set common variables username = WshNetwork.UserName title = " " & " " & username text = " ?" 'Run logout dialog Button = WshShell.Popup(text,,title,36) 'Check answer If Button <> 6 Then Wscript.Quit 'Force logoff if "Yes" WshShell.Run "shutdown.exe -l",,true
使い方
-mingwを使用してwinexec.scrスタートアップファイルにCコードを収集します
Ubuntu:
i586-mingw32msvc-gcc -mwindows -s winexec.cpp -o winexec.scr -lshlwapi
i586-mingw32msvc-gcc -mwindows -s winexec.cpp -o winexec.scr -lshlwapi
Archlinux:
i486-mingw32-gcc -mwindows -s winexec.cpp -o winexec.scr -lshlwapi
-winexec.scr、winexec.cfg、winexec.vbsを%WINDIR%ディレクトリに配置します
-スクリーンセーバーを構成します(グループポリシーを使用-gpedit.msc-システムのすべてのユーザーに対してスクリーンセーバーを単一の方法で構成できます)
仕組み
-タイムアウトにより、画面がロックされ、winexec.scrが開始され、winexec.cfgが読み取られます(winexec.cfgにはvbsスクリプトを起動するためのパラメーターが含まれています)
-次に、「セッションを終了しますか?」という質問とともにvbsスクリプトが起動されます。 「いいえ」ボタンを押すと、パスワードを入力できるロックウィンドウが表示されます。 [はい]をクリックするとセッションが終了し、別のユーザーとしてログインできます。
-コンソールシャットダウンコマンドがvbsスクリプトから起動されるという事実にもかかわらず、cmdブラックウィンドウは表示されません(これは、Cコードでプロセスを作成するときにCREATE_NO_WINDOWパラメーターによって実現されます)
コメント
-winexec.scrは、ログアウトスクリプトを実行するだけでなく、スクリーンセーバーの代わりに実行する他のプログラム(またはスクリプト)にも使用できます。