Windowsサービスからユーザを指定して
デスクトップを持つアプリを起動し、アプリの中からデスクトップにアクセスしたいのですが
起動するアプリ側で次のような2つの現象が出て困っています。
アプリを単独で起動すると問題なく動作します。
また、サービスからは指定ユーザで起動される事は確認できています。
(PowerShellでプロセス一覧で確認済み)
ちなみに起動のトリガーはホットフォルダーなのでタイミングは問題ないと思います。
【現象1】
log4netのログが出力されない。
C#のプログラムからテキスト出力は出来ます。
【現象2】
アプリ内でデスクトップにアクセス(画像を取得)が出来ない。
単体では問題ないのでサービス側の起動方法に何か考慮不足があるのかと
思っていますが、試行錯誤してもなかなか分かりません。
プロセス起動のソースは長いので取りあえず使っているAPIをピックアップしました。
ご存じの方がいらっしゃいましたらご教示頂けると幸いです。
――― プロセス起動で使っているAPI
//起動するユーザで認証
Win32Api.logonUser()
//偽装特権の有効化
Win32Api.OpenProcess()
Win32Api.OpenProcessToken()
Win32Api.LookupPrivilegeValue()
Win32Api.AdjustTokenPrivileges(
//新しいWindowStationを設定
Win32Api.GetProcessWindowStation()
Win32Api.openWindowStation()
//デスクトップのオープン
Win32Api.OpenDesktop()
Win32Api.SetProcessWindowStation()、
Win32Api.LoadUserProfile()
//ユーザの偽装を実施
Win32Api.ImpersonateLoggedOnUser()
//リダイレクトの設定
Win32Api.CreatePipe()
Win32Api.CreateEnvironmentBlock()
//環境ブロック
Win32Api.CreateEnvironmentBlock()
Win32Api.DestroyEnvironmentBlock()
//プロセス起動
Win32Api.CreateProcessAsUser()
Win32Api.OpenProcess()
//プロセスの優先度
Win32Api.OpenProcess()
Win32Api.SetPriorityClass()
// 偽装の解除
Win32Api.RevertToSelf()
―――
・起動するアプリ側のソース
C#
1namespace RPEtpCon 2{ 3 class Program 4 { 5 //ロガー 6 public static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 7 8 static void Main(string[] args) 9 { 10 logger.Info("コンソールアプリ(窓無し)を起動されました"); 11 12 File.WriteAllText(@"C:\RPEtest\log\test.txt", "Good morning!\n"); 13 System.Threading.Thread.Sleep(3000); 14 15 File.AppendAllText(@"C:\RPEtest\log\test.txt", "Good morning! 3秒後\n"); 16 17 // プライマリスクリーン全体 18 Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 19 logger.Debug("DeskTopを取得準備 "); 20 21 File.AppendAllText(@"C:\RPEtest\log\test.txt", "Good morning! DeskTopを取得準備\n"); 22 23 try 24 { 25 Graphics graphics = Graphics.FromImage(bitmap); 26 27 File.AppendAllText(@"C:\RPEtest\log\test.txt", "Good morning! Graphics.FromImage()\n"); 28 29 // 画面全体をコピーする 30 graphics.CopyFromScreen(new Point(0, 0), new Point(0, 0), bitmap.Size); 31 32 File.AppendAllText(@"C:\RPEtest\log\test.txt", "Good morning! Graphics.CopyFromScreen()\n"); 33 34 try 35 { 36 // bitmap.Save(@"C:\RPEtest\desktop.bmp"); 37 bitmap.Save(@"C:\RPEtest\desktop.jpg"); 38 39 logger.Debug("DeskTopを保存 "); 40 File.AppendAllText(@"C:\RPEtest\log\test.txt", "Good morning! DeskTopを保存\n"); 41 42 // グラフィックスの解放 43 graphics.Dispose(); 44 } 45 catch (Exception e) 46 { 47 logger.Error("DeskTopを保存err " + e.Message); 48 File.AppendAllText(@"C:\RPEtest\log\test.txt", "DeskTopを保存err " + e.Message +"\n"); 49 } 50 } 51 catch (Exception e) //ここでキャッチされる。 52 { 53 logger.Error("DeskTopを取得err " + e.Message);← 54 File.AppendAllText(@"C:\RPEtest\log\test.txt", "DeskTopを取得err " + e.Message + "\n"); 55 } 56 57 System.Threading.Thread.Sleep(7000); 58 logger.Info("コンソールアプリ(窓無し)を終了ました"); 59 File.AppendAllText(@"C:\RPEtest\log\test.txt", "コンソールアプリ(窓無し)を終了ました\n"); 60 } 61 } 62}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/08 11:59
退会済みユーザー
2021/02/08 13:29