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
たしかに、Everyone:rwx ないですね
exeもういっこ増やすのもまたなんだし、
自分自身のexe で自分自身のexe をrunas するのはどう?