File.Move(installerFile, newFile);\r
installerFile = newFile;\r
}\r
+ \r
+ // 権限を親フォルダに落とす\r
+ try {\r
+ string targetDir = Path.GetDirectoryName(installerFile);\r
+ NaGet.Utils.SetAccessControlRecursive(targetDir, File.GetAccessControl(Path.GetDirectoryName(targetDir)));\r
+ } catch (Exception) {} // 失敗時は何もしない\r
}\r
}\r
\r
}\r
\r
/// <summary>\r
- /// ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83©ã\81®ä¸\80æ\99\82ä¿\9då\98å\85\88ã\83\91ã\82¹ã\82\92ç\94\9fæ\88\90\r
+ /// インストーラの保存先パスを生成\r
/// </summary>\r
private string getArchiveFilePath()\r
{\r
}\r
} else {\r
Directory.CreateDirectory(folder);\r
+ \r
+ // 権限を親フォルダに合わせる\r
+ try {\r
+ Directory.SetAccessControl(folder, Directory.GetAccessControl(Path.GetDirectoryName(folder)));\r
+ } catch (Exception) {} // 失敗時無視\r
}\r
}\r
\r
new FileNotFoundException(errMsg, archiveInstExe));\r
}\r
\r
+ \r
+ \r
ProcessStartInfo procInfo = new ProcessStartInfo(archiveInstExe, archiveInstArgs);\r
procInfo.UseShellExecute = false;\r
procInfo.CreateNoWindow = true;\r
using System;\r
+using System.Collections.Generic;\r
using NaGet.Packages.Install;\r
using NaGet.Packages;\r
using NaGet.Net;\r
\r
private void initializeMainTaskSetNames()\r
{\r
- System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+ List<string> taskSetNames = new List<string>();\r
\r
for (int i =0; i < Installations.Length; i++) {\r
taskSetNames.Add(string.Format("取得: {0}", Installations[i].ToString()));\r
\r
{\r
// ハッシュ非適合なインストーラの表\r
- System.Collections.Generic.List<Installation> invalidInstallers = null;\r
+ List<Installation> invalidInstallers = null;\r
\r
while (invalidInstallers == null || invalidInstallers.Count > 0) {\r
currentTaskSetIndex = 0;\r
/// ダウンロードしたパッケージが整合したか否かハッシュでチェック\r
/// </summary>\r
/// <returns>整合しなかったインストーラのリスト</returns>\r
- private System.Collections.Generic.List<Installation> runCheckHashForInstaller()\r
+ private List<Installation> runCheckHashForInstaller()\r
{\r
- System.Collections.Generic.List<Installation> invalidInstallers = new System.Collections.Generic.List<Installation>();\r
+ List<Installation> invalidInstallers = new List<Installation>();\r
\r
int i = 0;\r
foreach (Installation inst in Installations) {\r
using System.Text;\r
using System.Globalization;\r
using System.Security.Principal;\r
+using System.Security.AccessControl;\r
using System.Reflection;\r
using System.Diagnostics;\r
using Microsoft.Win32;\r
\r
#endregion\r
\r
+ #region ファイル情報関連ユーテイリティ関数\r
+ \r
/// <summary>\r
/// パス変数に指定のフォルダを追加する\r
/// </summary>\r
return FormatSize((double) bytes);\r
}\r
\r
- #region ファイル操作関数群\r
- \r
/// <summary>\r
/// URLからそのファイル名を生成する\r
/// </summary>\r
bytes = null;\r
return output.ToString ();\r
}\r
- \r
- /// <summary>\r
- /// ファイルパスから、指定のパスセパレータの意味でファイル名を取り出す。\r
- /// </summary>\r
- /// <param name="filepath">ファイルパス(またはURLパス)</param>\r
- /// <param name="separator">パスセパレータ</param>\r
- public static string Basedir(string filepath, char separator)\r
- {\r
- int dirSep = filepath.LastIndexOf(separator);\r
- if (dirSep < 0) return "";\r
-\r
- return filepath.Substring(0, dirSep);\r
- }\r
- \r
+ \r
/// <summary>\r
/// 再帰的にファイルの属性を指定します。強制的にフォルダの再帰削除の前に読み込み専用属性を消すのに使います。\r
/// </summary>\r
}\r
\r
/// <summary>\r
+ /// 再帰的にファイルのアクセス権限(ユーザ権限など)を設定します\r
+ /// </summary>\r
+ /// <param name="path">設定するフォルダ</param>\r
+ /// <param name="filesec">変更先権限</param>\r
+ public static void SetAccessControlRecursive(string path, FileSecurity filesec)\r
+ {\r
+ // 自分自身の権限を変更\r
+ File.SetAccessControl(path, filesec);\r
+ \r
+ // 子ファイルの権限を変更\r
+ foreach (string file in Directory.GetFiles(path)) {\r
+ File.SetAccessControl(file, filesec);\r
+ }\r
+ \r
+ // 子フォルダを再帰的に権限変更\r
+ foreach (string file in Directory.GetDirectories(path)) {\r
+ SetAccessControlRecursive(file, filesec);\r
+ }\r
+ }\r
+ \r
+ /// <summary>\r
/// ファイルまたはフォルダの容量を算出して返す\r
/// </summary>\r
/// <param name="path">\r
#region 権限関連関数群\r
\r
/// <summary>\r
- /// 現在のユーザがAdministrators権限を持っているか否かを返す\r
+ /// 現在のユーザがAdministrators権限を持っているか否かを返す。\r
/// </summary>\r
+ /// <remarks>UAC有効時には権限昇格後になってtrueを返すようになります</remarks>\r
public static bool IsAdministrators()\r
{\r
- // TODO UAC はどうするんだ!!!!\r
- \r
// 現在の Windows ユーザーを現在のスレッドのプリンシパルに反映する\r
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal );\r
IPrincipal prin = System.Threading.Thread.CurrentPrincipal;\r