タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。
タイトルの通りです。管理者権限で実行しないとうまく動作しません。ちょっと改造してレジストリキーの所有者の変更もできると思います。
// ファイルの所有者を変更してみる by ake260// ※管理者権限で実行してください#uselib "advapi32.dll"#func OpenProcessToken "OpenProcessToken" int, int, var#func LookupPrivilegeValue "LookupPrivilegeValueA" int, sptr, var#func AdjustTokenPrivileges "AdjustTokenPrivileges" int, int, var, int, int, int#func LookupAccountName "LookupAccountNameA" sptr, str, sptr, var, str, var, var#cfunc SetNamedSecurityInfo "SetNamedSecurityInfoA" str, int, int, sptr, sptr, sptr, sptr#uselib "kernel32.dll"#cfunc GetCurrentProcess "GetCurrentProcess"#func Closehandle "CloseHandle" int#func FormatMessage "FormatMessageA" int, int, int, int, var, int, int#define FALSE 0#define NULL 0#define ERROR_SUCCESS $00000000#define TOKEN_ADJUST_PRIVILEGES $00000020#define SE_PRIVILEGE_ENABLED $00000002#define SE_FILE_OBJECT 1#define OWNER_SECURITY_INFORMATION $00000001#define FORMAT_MESSAGE_FROM_SYSTEM $00001000#define FORMAT_MESSAGE_IGNORE_INSERTS $00000200sdim DomainName, 256DomainNameSize = 256// 新しい所有者のユーザー名 (要管理者権限のユーザー)AccountName = "Administrators"// テスト用のファイルを指定 (作成しておいてください)file = "test_owner.txt"// プロセスに特権を付加 (一応) (いらないかも)OpenProcessToken GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hTokenLookupPrivilegeValue 0, "SeTakeOwnershipPrivilege", Luidtp = 1, Luid, 0, SE_PRIVILEGE_ENABLEDAdjustTokenPrivileges hToken, FALSE, tp, 0, NULL, NULLCloseHandle hToken// 指定されたユーザーのSIDのサイズを取得LookupAccountName 0, AccountName, NULL, SidSize, DomainName, DomainNameSize, snu// バッファの確保 本来はLocalAllocを使うようだが、sdimでもいいようだsdim Sid, SidSize// 指定されたユーザーのSIDを取得LookupAccountName 0, AccountName, varptr(Sid), SidSize, DomainName, DomainNameSize, snu// 所有者を設定ret = SetNamedSecurityInfo(file, SE_FILE_OBJECT, OWNER_SECURITY_INFORMATION, varptr(Sid), NULL, NULL, NULL)if (ret == ERROR_SUCCESS) {mes "所有者の設定が完了しました。"} else {mes "所有者の設定に失敗しました。"// エラーメッセージを表示 (一応)sdim ErrorBuf, 260FormatMessage FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, ret, 0, ErrorBuf, 260, NULLmes ErrorBuf}stop