C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: レジストリキーの最終書き込み時刻が取得できない


(過去ログ 118 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■69589 / inTopicNo.1)  レジストリキーの最終書き込み時刻が取得できない
  
□投稿者/ C#初心者 (15回)-(2014/01/10(Fri) 12:01:20)

分類:[.NET 全般] 

Windows7 Pro 32ビット
Microsoft C# 2010

次のソースでレジストリにアクセスしているが、
RegQueryInfoKeyは成功し、
ハンドルであるkeyや
サブキーの数ctSubKeysは取得できているが、
肝心なRegEnumKeyExになると
エラー5
アクセスが拒否されました
になる。

回避方法を教えてください。
よろしくお願いします。


using System.Runtime.InteropServices;

[DllImport("advapi32.dll")]
public static extern int RegOpenKeyEx(
UIntPtr hKey,
string subKey,
int ulOptions,
int samDesired,
out UIntPtr hkResult);

[DllImport("advapi32.dll")]
public static extern int RegQueryInfoKey(
UIntPtr hkey,
out StringBuilder lpClass,
ref uint lpcbClass,
IntPtr lpReserved,
out uint lpcSubKeys,
IntPtr lpcbMaxSubKeyLen,
IntPtr lpcbMaxClassLen,
IntPtr lpcValues,
IntPtr lpcbMaxValueNameLen,
IntPtr lpcbMaxValueLen,
IntPtr lpcbSecurityDescriptor,
IntPtr lpftLastWriteTime
);

[DllImport("advapi32.dll")]
extern public static int RegEnumKeyEx(
UIntPtr hkey,
uint index,
StringBuilder lpName,
ref uint lpcbName,
IntPtr reserved,
IntPtr lpClass,
IntPtr lpcbClass,
out long lpftLastWriteTime
);

public enum RegSAM
{
QueryValue = 0x0001,
SetValue = 0x0002,
CreateSubKey = 0x0004,
EnumerateSubKeys = 0x0008,
Notify = 0x0010,
CreateLink = 0x0020,
WOW64_32Key = 0x0200,
WOW64_64Key = 0x0100,
WOW64_Res = 0x0300,
Read = 0x00020019,
Write = 0x00020006,
Execute = 0x00020019,
AllAccess = 0x000f003f
}

public static class RegHive
{
public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);
public static UIntPtr HKEY_CURRENT_USER = new UIntPtr(0x80000001u);
}



static private void RunTest()
{
const string keyName = @"Software\Microsoft\Windows\CurrentVersion\Explorer";
UIntPtr key;
int status = RegOpenKeyEx(
RegHive.HKEY_CURRENT_USER, //UIntPtr hKey,
keyName, //string subKey,
0, //int ulOptions,
(int)RegSAM.QueryValue, //int samDesired,
out key //out UIntPtr hkResult
);
if (0 != status)
{
Console.WriteLine("RegOpenKeyEx failed");
return;
}

var className = new StringBuilder(1024);
var classNameLength = (uint)className.Capacity;
uint ctSubKeys;

status = RegQueryInfoKey(
key, //UIntPtr hkey,
out className, //out StringBuilder lpClass,
ref classNameLength, //ref uint lpcbClass,
IntPtr.Zero, //IntPtr lpReserved,
out ctSubKeys, //out uint lpcSubKeys,
IntPtr.Zero, //IntPtr lpcbMaxSubKeyLen,
IntPtr.Zero, //IntPtr lpcbMaxClassLen,
IntPtr.Zero, //IntPtr lpcValues,
IntPtr.Zero, //IntPtr lpcbMaxValueNameLen,
IntPtr.Zero, //IntPtr lpcbMaxValueLen,
IntPtr.Zero, //IntPtr lpcbSecurityDescriptor,
IntPtr.Zero //IntPtr lpftLastWriteTime
);
if (0 != status)
{
Console.WriteLine("RegQueryInfoKey failed");
return;
}

long lpftLastWriteTime;

for (uint xSubKey = 0; xSubKey < ctSubKeys; ++xSubKey)
{
var subKeyName = new StringBuilder(1024);
var subKeyNameLength = (uint)subKeyName.Capacity;

int status2 = RegEnumKeyEx(
key, //UIntPtr hkey,
xSubKey, //uint index,
subKeyName, //StringBuilder lpName,
ref subKeyNameLength, //ref uint lpcbName,
IntPtr.Zero, //IntPtr reserved,
IntPtr.Zero, //IntPtr lpClass,
IntPtr.Zero, //IntPtr lpcbClass,
// IntPtr.Zero //out long lpftLastWriteTime
out lpftLastWriteTime
);

if (0 != status2)
{
string errorMessage = new Win32Exception(status2).Message;
Console.WriteLine("RegEnumKeyEx failed:" + errorMessage);
break;
}
}
} // static private void RunTest()


private void button6_Click(object sender, EventArgs e)
{
RunTest();
Console.ReadKey();
}

引用返信 編集キー/
■69590 / inTopicNo.2)  Re[1]: レジストリキーの最終書き込み時刻が取得できない
□投稿者/ Hongliang (154回)-(2014/01/10(Fri) 12:18:43)
2014/01/10(Fri) 12:21:20 編集(投稿者)
http://msdn.microsoft.com/ja-jp/library/cc429912.aspx
RegEnumKeyEx関数の解説に、必要なアクセス権が記述されています。

ところで、Microsoft.Win32.RegistryおよびRegistryKeyを使用すれば、この辺のは大体不要になると思いますよ。
書き込み時刻は取得できないので、それが必要ならRegQueryInfoKeyは必要ですが。
関数に渡すハンドルはRegistryKey::Handleを使用できます。これはSafeRegistryHandleという型で、
RegQueryInfoKeyで今UIntPtrを使っているのの代わりにSafeRegistryHandleを使えます。

[DllImport("advapi32.dll")]
public static extern int RegQueryInfoKey(SafeRegistryHandle hkey, ...)

引用返信 編集キー/
■69592 / inTopicNo.3)  Re[2]: レジストリキーの最終書き込み時刻が取得できない
□投稿者/ C#初心者 (16回)-(2014/01/10(Fri) 13:12:03)
アクセス権を変更したらできました。
Hongliangさんありがとうございました。

引用返信 編集キー/
■69593 / inTopicNo.4)  Re[3]: レジストリキーの最終書き込み時刻が取得できない
□投稿者/ C#初心者 (17回)-(2014/01/10(Fri) 13:14:47)
No69592 (C#初心者 さん) に返信
> アクセス権を変更したらできました。
> Hongliangさんありがとうございました。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -