Windows NT6.0 ではPublic フォルダを自由に読み書きできるとは限らない

今回動かなくて悩んだのはこのコード

string shortcutPath = System.IO.Path.Combine(Environment.GetFolderPath(System.Environment.SpecialFolder.CommonDesktopDirectory), @"データ.lnk");
IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell();
IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutPath);
shortcut.Arguments = null;
shortcut.WorkingDirectory = null;
shortcut.TargetPath = targetPath;
shortcut.Save();
System.IO.File.Exists(shortcutPath);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shell);

 
ショートカットを All Users のデスクトップに一般ユーザー権限で作ろうと思ったら、エラーになるのね・ω・;

つまり、管理者権限の昇格が必要。とはいえ、アプリ本体を管理者で再起動するのも美しくない…。
というわけで、外部モジュールにして、そこだけ管理者に昇格するようにした。
 

System.Diagnostics.ProcessStartInfo psi =

new System.Diagnostics.ProcessStartInfo();

psi.UseShellExecute = true;

psi.FileName = Application.ExecutablePath.ToLower().Replace( 自分自身のexe, "shortcut.exe");

psi.Verb = "runas";

psi.Arguments = @"""" + targetPath + "\"";

psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
psi.ErrorDialog = true;

try
{

  System.Diagnostics.Process hProcess = System.Diagnostics.Process.Start(psi); 
  hProcess.WaitForExit();

  int result = hProcess.ExitCode;

  if (result == 1)
{

    MessageBox.Show("生成しました");

  }
else
{

    MessageBox.Show("作成できません");
  } 
} catch (System.ComponentModel.Win32Exception ex) {

    MessageBox.Show("外部処理に失敗しました");
}

・ω・ 意外と面倒なのね
 
Hard to create shortcuts in Users\Public\Desktop
 

おすすめ

1件の返信

  1. ななしさん より:

    へぇ~ +1
    たしかに、Everyone:rwx ないですね
    exeもういっこ増やすのもまたなんだし、
    自分自身のexe で自分自身のexe をrunas するのはどう?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です